私は、189383040
浮動小数点数まで格納する必要があるかなり大きなシミュレーション コードを扱うようになりました。これは大きいことはわかっていますが、これを克服するためにできることはあまりありません。たとえば、それらの一部だけを調べたり、1 つずつ処理したりするだけです。
エラーを再現する短いスクリプトを作成したので、さまざまな環境ですばやくテストできます。
noSnapshots = 1830
noObjects = 14784
objectsDict={}
for obj in range(0, noObjects):
objectsDict[obj]=[[],[],[]]
for snapshot in range(0,noSnapshots):
objectsDict[obj][0].append([1.232143454,1.232143454,1.232143454])
objectsDict[obj][1].append([1.232143454,1.232143454,1.232143454])
objectsDict[obj][2].append(1.232143454)
これは実際のコードの構造を表しており、いくつかのパラメータ (長さ 3 の 2つと浮動小数点数 1 つ) をオブジェクトlists
ごとに個別の場所に格納する必要があります。当然のことながら、数値はオブジェクトごとに毎回異なりますが、私のコードでは、ランダムに型付けされた数値を使用しました。14784
1830
それほど驚くことではありませんが、Windows 7 Enterprise および Home Premium ではMemoryError
. 16 GB の RAM を搭載したマシンでコードを実行しても、マシンにはまだ十分なメモリが残っているにもかかわらず、失敗します。したがって、最初の質問は次のようになります。なぜそうなるのか? RAMが多ければ多いほど、メモリに保存できるものが増えると思います。
同僚の Ubuntu 12.04 マシン (これも 16 GB の RAM) で同じコードを実行しましたが、問題なく終了しました。もう 1 つ知りたいのは、このコードで Windows を満足させるためにできることはありますか? つまり、Python プロセスにヒープとスタックのメモリを増やしますか?
最後に:コード例と同様の方法で大量のデータをメモリに保存する方法について何か提案はありますか?
編集
答えた後、コードを次のように変更しました。
import numpy
noSnapshots = 1830
noObjects = int(14784*1.3)
objectsDict={}
for obj in range(0, noObjects):
objectsDict[obj]=[[],[],[]]
objectsDict[obj][0].append(numpy.random.rand(noSnapshots,3))
objectsDict[obj][1].append(numpy.random.rand(noSnapshots,3))
objectsDict[obj][2].append(numpy.random.rand(noSnapshots,1))
保存しなければならない大量のデータにもかかわらず機能します。