2

私はpythonを使用していますが、ドキュメントのインデックスを作成するとき(検索エンジン用)には大量のRAMが必要です。インデックス作成プロセスを停止した後も、メモリはまだいっぱいです(8GBのRAMなど)。検索エンジンを常に動作させ、インデックス作成が終了したときに OS をリセットしないようにする必要があるため、これは悪いことです。巨大な配列、辞書、リストを管理する効率的な方法と、それらを解放する方法はありますか? 何か案は?

stackoverflow でそれに関するいくつかの質問も見ましたが、それらは古いものです:

Python のメモリ フットプリントとヒープ サイズ

Python でのメモリ割り当てのプロファイル (Numpy 配列のサポートあり)

情報:

free -t
             total       used       free     shared    buffers     cached
Mem:          5839       5724        114          0         15       1011
-/+ buffers/cache:       4698       1141
Swap:         1021        186        835
Total:        6861       5910        950


top | grep python 

 3164 root      20   0 68748  31m 1404 R   17  0.5  53:43.89 python                                                                     
 6716 baddc0re  20   0 84788  30m 1692 S    0  0.5   0:06.81 python     

 ps aux | grep python

root      3164 57.1  0.4  64876 29824 pts/0    R+   May27  54:23 python SE_doc_parse.py
baddc0re  6693  0.0  0.2  53240 16224 pts/1    S+   00:46   0:00 python index.py

uptime

01:02:40 up  1:43,  3 users,  load average: 1.22, 1.46, 1.39


sysctl vm.min_free_kbytes

vm.min_free_kbytes = 67584

本当の問題は、スクリプトを開始するとインデックス作成が高速になることですが、使用量が増えると遅くなります。

Document wikidoc_18784 added on 2012-05-28 01:03:46 "fast"
wikidoc_18784
-----------------------------------
Document wikidoc_21934 added on 2012-05-28 01:04:00 "slower"
wikidoc_21934
-----------------------------------
Document wikidoc_22903 added on 2012-05-28 01:04:01 "slower"
wikidoc_22903
-----------------------------------
Document wikidoc_20274 added on 2012-05-28 01:04:10 "slower"
wikidoc_20274
-----------------------------------
Document wikidoc_23013 added on 2012-05-28 01:04:53  "even more slower"
wikidoc_23013

ドキュメントのサイズは、最大 1 ページまたは 2 ページのテキストです。10 ページのインデックス作成には約 2 ~ 3 秒かかります。

Tnxの皆さん、助けてください:)

4

3 に答える 3

3

議論から、あなたは巨大な巨大なdictにデータを保存しているようです(まっすぐな顔でそれを言うことはめったにありません;))おそらく、redisのような適切なデータベースにデータをオフセットすると、Pythonのメモリ使用量が減る可能性があります。また、データの処理がより効率的かつ高速になる可能性があります。

于 2012-05-28T09:57:13.030 に答える
3

あなたの問題は、メモリの使用量が多すぎることに関連している可能性はありません。システムが使用するメモリが多いほど、実行速度が速くなります。そのため、パフォーマンスを向上させるためにシステムにメモリを追加します。使用するメモリを減らすとシステムが高速になると思われる場合は、メモリをいくらか取り除いてください。これにより、使用するメモリが少なくなります。しかし、当然のことながら、そうすると遅くなります。

メモリを解放するには労力がかかるため、システムはメモリを使用したままにします。また、空きメモリは何もしないため、メリットはありません。今日半分使ったら、明日は2倍使えるというわけではありません。システムが何かのためにメモリを必要とする場合、メモリをある用途から別の用途に直接移動するだけで簡単に実行できます。大量のメモリを自由に使用する必要はありません。

最新のオペレーティング システムでは、メモリをある用途から別の用途に移行できないという特定のタイプの異常なケースに対処するために、少量のメモリしか確保できません。Linux では、次のコマンドを使用して、システムに必要な空きメモリの量を確認できますsysctl vm.min_free_kbytes。おそらく、それが空きメモリのおよその量であることに気付くでしょう。システムが必要としているのは、これで十分です。

したがって、メモリを解放する必要はありません。システムが遅い理由を突き止めたいとします。

更新:あなたの新しい情報からSE_doc_parse.py、CPUを激しく非難しているようです。可能であれば、そのコードの最適化を検討します。

更新: 意図したサイズを超えて使用され、CPU を占有する非効率的な辞書アルゴリズムだったようです。

于 2012-05-28T08:56:04.197 に答える
1

次の理由の少なくとも1つが原因で、プログラムの速度が低下していると思います。

  • メモリがスワッピングを開始し、データが RAM からディスクに、またはその逆になります。実際、解決策は、プログラムが使用するメモリを少なくすることです。
  • 使用するアルゴリズムは、データ サイズに対して適切にスケーリングされません。この場合、より良いアルゴリズムを見つけることが明らかに解決策です。

どちらの場合も、より具体的な解決策を提供するために、コードの一部 (本質的に何を意味するのか) を確認する必要があります。

一般的なソリューションには次のものがあります。

  • del変数がもう必要ないことを示すためにPython を使用します。
  • リストの代わりに反復子を使用する (反復子は多くのメモリを使用しません)。
于 2012-05-28T09:27:37.467 に答える