1. 程式人生 > >【Multiprocessing】採用多程序計算處理資料

【Multiprocessing】採用多程序計算處理資料

0x00 前言

在資料處理方面,通常會將較為簡單的源資料存於本地磁碟中,
每次使用時讀取,經過生成函式生成模型可以直接使用的訓練資料,
而這種資料通常為矩陣的形式,考慮到padding位的情況下通常較大,
那麼,在源資料的量較大,而生成的資料的空間佔用增量巨大無法存於本地,
就需要採用生成一個,傳輸一個,消耗一個,之後再生成的形式。

線性計算終歸是緩慢的,此時就需要多程序進行處理,
如下所示,基本框架用以記錄多程序計算的基本方法:
後續有空的時候再繼續記錄一下基於此的、時空複雜度均更優的 “生產者—消費者” 模型。

0x01 Source Code

ori_data = range(65536
) def get_args(i): batch_size = 5 * 200 return ori_data[i * batch_size: (i+1) * batch_size], i, 'container_{}'.format(i) def batch_data_generate_fn(inp, i, name): print('Run child process %s (%s)' % (name, os.getpid())) # do some calculation etc. return inp def generate_with_multiprocessing
(method='default', fn=None):
import multiprocessing targets = { # pre-defined functions # 'segments': generate_original_segments_single_task, # 'single': batch_data_generate_single_block, # 'batch': batch_data_generate_single_task, 'default': batch_data_generate_fn, } print('Run the main process (%s).'
% (os.getpid())) i = 0 n_cores = 9 for i in range(n_cores): p = multiprocessing.Process( target=targets.get(method), args=fn(i) if fn else (i,)) p.start() print('Waiting for all subprocesses done ...') generate_with_multiprocessing(method='default', fn=get_args)

0x02 實際場景運用

def generate_correction_input_from_path_case(path_case, name_prefix=0):
    ret, file_idx = [], 0
    print('Run the child process<{}> {}.'.format(name_prefix, os.getpid()))
    for path in path_case:
        if os.path.exists(path):
            data = load301(0, path)
            sents = sentence_dict_to_correction_input(data.get('Sentence', []), False)
            ret.extend(sents)
        name = path.split('/')[-1] if path.split('/')[-1] != 'output.o301' else path.split('/')[-2]
        print("Now solving {:>6s} | cache {:>05} sentences for file-{:>02}{:>04}".format(
            name.replace('.o301', ''), ret.__len__(), name_prefix, file_idx))
        while ret.__len__() > 10000:
            pickle.dump(
                ret[:10000],
                open('/data/chend/sentence_words_180901/{:>02}{:>04}.pkl'.format(
                    name_prefix, file_idx), 'w'))
            file_idx += 1
            del ret[:10000]
    else:
        pickle.dump(
            ret,
            open('/data/chend/sentence_words_180901/{:>02}{:>04}.pkl'.format(
                name_prefix, file_idx), 'w'))
        del ret[:]



def generate_correction_input_from_o301():
    import multiprocessing
    print('Run the main process {}.'.format(os.getpid()))

    n_cores = 25
    bad_docs = [line for line in open('/data/bad_quality.txt', 'rb')]
    dir_name = '/data/pdf_bond_disclosure_nafmii/'
    online_doc_case, total_doc_case = [], []

    for idx in range(364, 4467):
        doc = str(idx)
        if doc in bad_docs:
            continue
        online_doc_case.append("/data/fake_path/{}/output.o301".format(doc))

    for _, _, files in os.walk(dir_name):
        for file_name in files:
            if file_name.endswith('o301'):
                total_doc_case.append(dir_name + file_name)

    path_case = sorted(online_doc_case + total_doc_case)
    block_size = int(path_case.__len__() / n_cores)
    for core in range(n_cores):
        args = (path_case[block_size*core: block_size*core+block_size], core)
        p = multiprocessing.Process(
            target=generate_correction_input_from_path_case,
            args=args
        )
        p.start()

    print('Waiting for all subprocesses done ...')

相關推薦

Multiprocessing採用程序計算處理資料

0x00 前言 在資料處理方面,通常會將較為簡單的源資料存於本地磁碟中, 每次使用時讀取,經過生成函式生成模型可以直接使用的訓練資料, 而這種資料通常為矩陣的形式,考慮到padding位的情況下通常較大, 那麼,在源資料的量較大,而生成的資料的空間佔用增

MultiprocessingPython程序記憶體共享資料佇列SMQueue

0x00 前言 自從先前研究了下Python的多程序計算(原文連結)之後, 深深地感受到多程序處理的美好,並決定運用到模型訓練時, 作為 feed data 的資料處理模組使用,實現工具類 SharedMemoryQueue。 但是眾所周知,python的程序間

PythonPython程序multiprocessing程序池Pool的返回值順序

問題起因最近要將一個文字分割成好幾個topic,每個topic設計一個regressor,各regressor是相互獨立的,最後彙總所有topic的regressor得到總得預測結果。沒錯!類似bagging ensemble!只是我沒有抽樣。文字不大,大概3000行,top

523selenium窗口處理

window 不可 窗口 png 當前 inf bdr 圖片 http 在網站使用新窗口打開頁面時,瀏覽器通常會自動跳轉到新打開的窗口。 於是,使用webdriver驅動瀏覽器打開網站的時候,也就想當然的以為窗口已經跳轉到新打開的窗口。 然而,事實果真如此嗎? 我們可以使用

ES6vue中Swipe外掛處理資料應用於輪播分頁

JSON資料: category_list_res: [ { name: '美食', url: 'http://p1.meituan.net/jungle/bd3ea637aeaa2fb612

轉載最全的計算廣告資料,廣告演算法工程師入門

在廣告這樣的參與者可以針對同一個標的物不斷調整出價的拍賣環境中,通過聰明的定價策略,完全可能為整個市場創造更高的收益以及其他好處。 拍賣方式 分配規則 支付方式 是否知道別人的出價 應用場景 英式拍賣(Open) 競買者逐步加價, 直到最後只剩下一個投標人為止 出價最高者得

爬蟲小程式:爬取鬥魚所有房間資訊Xpath(程序版)

  # 本程式親測有效,用於理解爬蟲相關的基礎知識,不足之處希望大家批評指正 1 import requests 2 from lxml import etree 3 from multiprocessing import JoinableQueue as Queue 4 from

BioCode個蛋白質序列分成單個的txt文檔

span package bsp -1 http println != show ade 代碼說明: fasta格式的蛋白質序列,一個txt裏面有很多蛋白質序列,計算ss、pssm或disorder score時候都需要單條計算,需要分開。 分割前: 分割後: show

轉載JAVA線程讀取、操作List集合

線程 nbsp static 一點 stat lang 素數 param 應用 本文轉載自:http://blog.csdn.net/wang1989cs/article/details/47663565 import java.util.ArrayList; impor

Hibernate---註解一對

hash chan -c blog nsa hbm.xml 技術 word mysq 一、核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configurati

SmartOS輕量級任務調度系統

tint sys 多線程 remove 希望 opera div 開始時間 調度 SmartOS是一個完全由新生命團隊設計的嵌入式操作系統,主要應用於智能家居、物聯網、工業自動化控制等領域。ARM Cortex-M系列微處理器幾乎全都做成單核心,對於業務邏輯較復雜的物聯網就

錯誤混合模式程序集是針對“v2.0.50727”版的運行時生成的,在沒有配置其他信息的情況下,無法在 4.0 運行時中加載該程序集。

csharp 技術分享 image framework src sharp ted 程序集 方案 解決方案,在app.config中添加一個配置節:startup <?xml version="1.0" encoding="utf-8" ?> <

如何理解雲計算?很簡單,就像吃貨想吃披薩了

公司 如果 pan 雲技術 cit 分類 本地應用 style 分發 你一定聽說過雲計算中的三個“高大上”的概念:IaaS、PaaS和SaaS。這幾個術語並不好理解。不過,如果你是個吃貨,還喜歡披薩,這個問題就好解決了!好吧,其實你根本不是一個吃貨,之所以自我標榜為

CSSwidth和height計算

pre webkit logs mage height web wid div css width:calc(100% - 20px); width:-webkit-calc(100% - 20px);//chrome width:-moz-calc(100% - 20p

python-socketServer並發

服務 技術分享 tcp 就會 CP log 服務器 pytho 好用 多線程並發: 修改以上信息即可. 多並發:每來一個請求,服務器就會開一個線程。開啟這個線程和這個額連接進行交互。 多進程並發: ForkingTCPServer在linux上好用。 【pyth

CF662CBinary Table 按位處理

urn strong class i++ xor ios ++ limit mes 【CF662C】Binary Table 題意:給你一個$n\times m$的01網格,你可以進行任意次操作,每次操作是將一行或一列的數都取反,問你最多可以得到多少個1? $n\le

福利成為專業程序員路上用到的21個技術點,你知道嗎?

java 分布式 微服務 設計模式 程序員 歡迎點贊,讓更多人看到,讓福利普照。 因為本文以後不會更新,但項目依舊會更新。成為一名專業程序員的道路上,需要堅持練習、學習與積累,技術方面既要有一定的廣度,更要有自己的深度。 1.JVM相關(包括了各個版本的特性)對於剛剛接觸Java的人來說,

Django一對表結構

class del from 抓取數據 cts 內容 模擬 rec files 1.創建project數據庫表 INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘,

轉載一個c程序在執行main函數之前和main之後都做了那些事情

loss -- text ould 很多 int win 部分 不知道 轉自:https://bbs.csdn.net/topics/300103318#r_78088969 main函數之前--真正的函數執行入口或開始一種解釋實際上,在可執行文件被加載之後,控制權立即交給

技巧-NO.123.數據處理技巧

數據處理 println www http bsp master red iter gre Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffcult