私は非常に巨大な入力ファイルを取り、それから辞書を作成するプログラムを持っています。これがメモリに収まるわけがないので、shelf を使用してディスクに書き込むことにしました。ここで、解析を高速化できるように、システムで使用可能な複数のコア (うち 8 つ) を利用する必要があります。これを行う最も明白な方法は、入力ファイルを 8 つの部分に分割し、8 つの部分すべてで同時にコードを実行することでした。問題は、最終的に辞書が 1 つしか必要ないことです。それらの8ではありません。では、shelf を使用して 1 つの辞書を並行して更新するにはどうすればよいでしょうか。
2 に答える
ここで、Pythonで複数のプロセスから単一のファイルを処理するについてかなり詳細な回答をしました
一度に多くのプロセスをシェルブに書き込む方法を理解しようとしないでください。単一のプロセスで結果を棚上げにする方法を考えてみてください。
アイデアは、キューへの入力を生成する単一のプロセスがあるということです。次に、キューに入れられたアイテムを受け取り、作業を行うワーカーを必要な数だけ用意します。それらが完了すると、シンクが読み取れるように結果を結果キューに配置します。利点は、事前に手動で作業を分割する必要がないことです。「入力」を生成するだけで、読み込まれたワーカーがそれを取得して処理できるようになります。
このパターンでは、システムの機能に基づいてワーカーをスケールアップまたはスケールダウンできます。
shelve
同時アクセスはサポートしていません。あなたが望むことを達成するためのいくつかのオプションがあります:
プロセスごとに1つのシェルフを作成し、最後にマージします。
ワーカープロセスに結果をマスタープロセスに返送させ
multiprocessing.Pipe
ます。その後、マスターはそれらを棚に保管します。棚のようなAPIでbsddbを同時アクセスで動作させることができると思いますが、そうする必要はありませんでした。