2012-07-15 133 views
3

我有一個程序,需要一個非常大的輸入文件,並從中作出一個字典。由於這種方式不適合內存,我決定使用shelve將其寫入我的磁盤。現在我需要利用我係統中可用的多個內核(其中8個),以便加速解析。我想過的最明顯的方法是將我的輸入文件分成8個部分,並同時在所有8個部分上運行代碼。問題是我最終只需要1個字典。不是其中8個。那麼我該如何使用shelve來並行地更新一個字典呢?更新Python中的擱置字典

回答

4

我介紹了Processing single file from multiple processes in python

一個相當詳細的解答here不要試圖找出你都可以有很多方法寫一個貨架一次。考慮如何讓一個流程將結果交付給貨架。

這個想法是,你有一個單一的過程產生輸入到queue。然後,你有儘可能多的工人,你想收到排隊的物品和工作。完成後,他們將結果放入結果隊列中供接收器讀取。好處是您不必提前手動分配工作。只要產生「輸入」,讓任何工作人員閱讀並使用它。

使用此模式,可以根據系統功能向上或向下擴展工作人員。

4

shelvedoesn't support concurrent access。有幾個選項可以完成你想要的功能:

  1. 爲每個進程創建一個架子,然後在最後合併。

  2. 讓工作進程通過例​​如multiprocessing.Pipe將結果發送回主進程;主人然後將它們存儲在架子上。

  3. 我認爲你可以得到bsddb在類似shelve的API中同時訪問,但我從來沒有這樣做過。

+0

我推薦選項2.它很容易忘記同時寫入擱置並讓一個作者從隊列中接受。所有工作人員解析並添加到隊列中。 「生產者 - 工人匯」 – jdi 2012-07-15 17:18:28