3

私の問題は非常に単純です。10,000,000 行のデータで満たされた 400MB のファイルがあります。RAM がいっぱいになるのを避けるために、各行を反復処理し、何かを実行して、その行をメモリから削除する必要があります。

私のマシンには複数のプロセッサがあるため、このプロセスを最適化する最初のアイデアは、2 つの異なるプロセスを作成することでした。一度に数行ずつファイルを読み取り、徐々にリストを埋めていきます (リストの 1 つの要素がファイルの 1 行になります)。もう 1 つはこの同じリストにアクセスし、そこから要素を pop() して処理します。これにより、片側から拡大し、反対側から縮小するリストが効果的に作成されます。

言い換えれば、このメカニズムは、2 番目のプロセスがクランチするための行が常に入力されるバッファーを実装する必要があります。しかし、おそらくこれは以下を使用するよりも高速ではありません:

for line in open('/data/workfile', 'r'):
4

4 に答える 4

4

あなたの提案for line in open('/data/workfile', 'r'):はジェネレーターを使用するため、ファイル全体がメモリに読み込まれることはありません。実際に遅すぎることが判明するまで、私はそれを続けます。

于 2010-03-05T16:52:04.233 に答える
2

おそらく、ディスクの速度によって制限されています。Python はすでにバッファリングを行っているため、1 行ずつ読むのが効率的です。

于 2010-03-05T16:51:28.953 に答える
1

おそらく、盲目的に最適化する前に、既存のコードをプロファイリングして、ボトルネックが実際にどこにあるかを確認することをお勧めします。

処理が実際に I/O バウンドである場合でも、プログラムにいくつかのスレッドを追加すると、少しは役立つ可能性があります。

これにより、別のスレッドが以前に読み取ったデータを処理している間に、別のスレッドが IO を待機できるようになります。

于 2011-04-16T08:09:22.037 に答える
0

使用したいデータ構造は、マルチプロセッシング モジュールで利用可能なキュー (たとえば、同時書き込みのための適切なブロック メカニズムを備えています) です。

データの処理の間に依存関係がない場合は、そのモジュール内の関数を使用して行ごとにジェネレーターをプロセスのプールにマップし、数行ですべてをマルチコア対応にすることができます。

関連項目 mapReduce アプローチ (少しやり過ぎかもしれませんが)

于 2010-03-05T17:34:01.943 に答える