2

私は、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ごとに個別の場所に格納する必要があります。当然のことながら、数値はオブジェクトごとに毎回異なりますが、私のコードでは、ランダムに型付けされた数値を使用しました。147841830

それほど驚くことではありませんが、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))

保存しなければならない大量のデータにもかかわらず機能します。

4

1 に答える 1

1

Python では、 everyfloatはヒープ上のオブジェクトであり、独自の参照カウントなどがあります。これだけ多くの float を格納するには、 のような float のリストの密な表現を実際に使用する必要がありますnumpyndarray

また、同じfloatオブジェクトを再利用しているため、メモリ使用量を正しく見積もっていません。float同じ単一のオブジェクトへの参照のリストがあります。実際のケース ( floats が異なる場合) では、メモリ使用量ははるかに高くなります。あなたは本当に使うべきndarrayです。

于 2013-10-23T14:10:16.607 に答える