4

主にdictで大量のメモリを消費するpythonプログラムがあります。この dict は、一意の整数値を非常に大きなキー セットに割り当てる役割を果たします。大規模な行列を扱っているため、元に戻すこともできるキーとインデックスの対応が必要です (つまり、行列の計算が完了したら、値を元のキーにマップし直す必要があります)。

この量は最終的に利用可能なメモリを超えると思います。スワップスペースに関してこれがどのように処理されるのか疑問に思っています。おそらく、この目的のためのより良いデータ構造があります。

4

4 に答える 4

5

データがメモリを超える場合は、データベースが必要です。ディクショナリのインデックス作成は、ディクショナリがメモリよりも大きい場合に優れたパフォーマンスを発揮するようには設計されていません。

于 2010-03-10T20:17:03.227 に答える
2

スワップ スペースはカーネル機能であり、ユーザーに対して透過的です (python)。

巨大な dict があり、すべてのデータを一度に必要としない場合は、必要なことを行う可能性のあるredisを調べることができます。またはそうでないかもしれません :)

于 2010-03-10T20:17:17.480 に答える
1

ハッシュテーブルには非常にランダム化されたメモリアクセスパターンがあるため、スワップトラッシュに終わるだけです。

マップが物理メモリのサイズを超えていることがわかっている場合は、最初にディスク上のデータ構造を使用することを検討できます。これは特に、計算中にデータ構造が必要ない場合に当てはまります。ハッシュ テーブルがスワッピングをトリガーすると、ハッシュ テーブル自体の外部でも問題が発生します。

于 2010-03-10T20:17:29.247 に答える
1

私が覚えている限りでは、dict が展開されると、C の malloc に依存するだけです。malloc が成功し続ける限り、プログラムは実行され続けます。ほとんどの OS は、十分なメモリがある限り、そしてスワップインできるページがある限り、malloc を動作させ続けます。どちらの場合でも、ドキュメントに従って、malloc が失敗すると Python は MemoryError 例外をスローします。データ構造に関する限り、dict は空間的に非常に効率的です。より良い結果を得る唯一の方法は、分析関数を使用して値を前後にマッピングすることです。

于 2010-03-10T20:19:33.433 に答える