0

220 万件のレコードに関するデータを処理するプログラムを作成しました。レコードごとに、合計で約 0.01 秒かかる一連の 20 回の計算を通過します。より高速に実行するために、私は Python マルチプロセスを使用し、データを一般的に 6 つのブロックに分割し、ペイロードをプロセスに配布して実行を調整するマスター プロセスと並行して実行します。ところで、計算の結果、プログラムは約 2200 万のレコードをデータベースに書き込みます。

Python 3.2.2で実行されている8GB RAMを搭載したMacBookPro i7 2.2GHzでこれを実行しています。データはローカルの MySQL サーバーにあります。

プログラムは順調に起動します。予測可能な方法で実行され、CPU の使用率は平均 60 ~ 70% で、Macbook Pro はオーブンのように熱くなります。その後、約 5 時間実行すると速度が低下し、各コアの CPU 使用率が平均 20% に低下します。- 各 Python プロセスは、約 480 MB の実 RAM と約 850 MB の仮想 RAM を消費しています。これらの重いプロセスは全部で 6 つあり、OSX が消費する仮想メモリの合計 (アクティビティ モニターで表示) は約 300GB です。

パフォーマンスの低下は、大量のメモリ消費と潜在的に高いページ スワップが原因であると思われます。

これらの症状をより適切に診断するにはどうすればよいですか? 大規模なメモリ内オブジェクトを長時間実行している Python に問題はありますか? 実際、今日のテクノロジーにとって 6 時間実行することは重荷ではないと思いますが、私は Python の経験が半年ほどしかないので、何を知っているのでしょうか?!

ありがとう!

4

1 に答える 1

0

パフォーマンスの低下は、メモリの内外で物を交換しているためだと思います。問題はプログラムの実行時間ではないと思います.Pythonはガベージコレクタを使用しているため、メモリリークはありません.

まあ、それは完全に真実ではありません。ガベージ コレクターは、到達できないものを確実に削除します。(つまり、おそらくアクセスできるものは削除されません。) ただし、データ構造がプログラムの残りの部分で使用されない場合を検出するほどスマートではありません。Noneそれが正しく機能するためには、それへのすべての参照をそれに設定して明確にする必要があるかもしれません。

  1. 関連するコードを投稿できますか?

  2. これは、特定のレコードを複数回必要とするプログラムですか? レコードをロードする順序はプログラムにとって重要ですか?

  3. Python プロセスに数ギガバイトのメモリしか割り当てられていないのに、なぜ 300 GB のメモリが使用されているのでしょうか?

于 2012-10-21T11:51:31.133 に答える