簡體   English   中英

Python多處理池; 等待迭代完成

[英]Python multiprocessing pool; wait for iteration to complete

我有一個很大的數據集,我希望我的腳本可以迭代通過,對每個條目執行一系列操作,然后將結果排列以存儲到HDD。 由於數據集可能相對較大(〜250 GB),因此RAM的可用性要求數據集必須一次處理1000個條目的塊(在下面的代碼中我稱之為dataBlock)。 我還使用multiprocessing.Pool類來促進使用多個CPU內核來完成此任務。

我基本上已經安排好了一切,以便將每個dataBlock傳遞給Pool,Pool使用imap方法對dataBlock執行所需的計算,Pool返回計算結果,並將數據塊的結果附加到列表中。 此列表( processed_data )是該組計算的所需最終產品。

processed_data = []

multiprocessing.Pool(processor_cap) as pool:

    for blockIndex, block in enumerate(range(1000, height-remainder, 1000)):

        #Read-in 1000 spectra from source dataset
        dataBlock = np.asarray(raw_dset[blockIndex*1000:block][:])

        '''
        Pass data block to processor pool, which iterates through data
        block. Each spectrum is handed off to a CPU in the pool,
        which centroids it and appends the result to "processed_block".
        '''
        processed_block = pool.imap(centroid_spectrum, dataBlock)

        #Append processed spectra to processed data bin
        for idx, processed_spectrum in enumerate(processed_block):
            processed_data.append(processed_spectrum)

我想知道的是如何使腳本暫停的呼叫后pool.imap()直到完全processed_block不關閉池已恢復。 目前,它的進展對入for環路立即在的這段遵循以上無需等待processed_block由返回pool.imap 我已經嘗試在pool.imap()調用之后立即調用pool.join() ,但是它僅返回***AssertionError並再次繼續其下面的for循環。 一旦將所有dataBlocks饋入池中,就在上面最外層for循環的末尾,我最終可以在腳本中稍后成功地調用pool.close()pool.join()

在此先感謝您的幫助!

如果不付出很多努力來改變周圍的事物,那么使用示例很難。 但是,如果您從imap()調用中獲得了迭代器,則可以考慮在到達for循環之前將迭代器的元素解析為列表:

processed_block = pool.imap(centroid_spectrum, dataBlock)
processed_block = [ x for x in processed_block ] # convert from an iterator to a list
for idx, processed_spectrum in enumerate(processed_block):

等等

這樣能達到您想要的嗎?

我只是將Pool.imap()調用更改為Pool.map()調用,並且腳本按預期運行。 有關更多信息,請參見與Mikhail Burshteyn的交流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM