69

科学的な目的のために、大規模な (非常に) 行列 (マルコフ連鎖) を作成する必要があります。20301 個の要素 (= 行列の 1 行) のリストに入れた微積分を実行します。次のマルコフステップに進むには、メモリ内のすべてのデータが必要ですが、必要に応じて別の場所 (ファイルなど) に保存できますが、マルコフ連鎖のウォークスルーが遅くなる場合があります。私のコンピューター (科学実験室): バイキセノン 6 コア/各 12 スレッド、12GB メモリ、OS: win64

  Traceback (most recent call last):
  File "my_file.py", line 247, in <module>
    ListTemp.append(calculus)
MemoryError

計算結果の例: 9.233747520008198e-102 (はい、1/9000 を超えています)

19766 番目の要素を格納するときにエラーが発生します。

ListTemp[19766]
1.4509421012263216e-103

もっと行けば

Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    ListTemp[19767]
IndexError: list index out of range

したがって、このリストには 19767 ループでメモリ エラーがありました。

質問:

  1. リストにメモリ制限はありますか? それは「リストごとの制限」ですか、それとも「スクリプトごとのグローバル制限」ですか?

  2. これらの制限を回避する方法は? 考えている可能性はありますか?

  3. numpy、python64 を使用すると役立ちますか? それらのメモリ制限は何ですか? 他の言語はどうですか?

4

4 に答える 4

58

まず 、 Python 配列はどのくらい大きくなりますか?を参照してください。Numpy、長い配列の問題

次に、唯一の実際の制限は、使用しているメモリの量と、システムがメモリ参照を格納する方法によって決まります。リストごとの制限はないため、Python はメモリがなくなるまで実行されます。2 つの可能性:

  1. 古い OS や、プロセスが制限された量のメモリを強制的に使用する OS で実行している場合は、Python プロセスがアクセスできるメモリの量を増やす必要がある場合があります。
  2. チャンクを使用してリストを分割します。たとえば、リストの最初の 1000 要素をピクルしてディスクに保存し、次の 1000 を実行します。それらを使用するには、一度に 1 つのチャンクをアンピクルして、メモリが不足しないようにします。これは基本的に、データベースが RAM に収まりきらないほど多くのデータを処理するために使用する手法と同じです。
于 2011-04-04T11:23:57.973 に答える
30

表示されMemoryErrorている例外は、使用可能な RAM が不足した直接の結果です。これは、Windows ( 32 ビット プログラム)によって課されたプログラムごとの 2GB の制限、またはコンピューターで使用可能な RAM の不足が原因である可能性があります。(このリンクは前の質問へのリンクです)。

Windows の 64 ビット コピーを使用している場合、Python の 64 ビット コピーを使用して 2GB を拡張できるはずです。

これIndexErrorは、Python がMemoryError 配列全体を計算する前に例外をヒットしたために発生します。繰り返しますが、これはメモリの問題です。

この問題を回避するには、Python の 64 ビット コピーを使用するか、結果をファイルに書き込む方法を見つけてください。この目的のために、numpy のメモリ マップド アレイを見てください。

実際のデータはディスクに書き込まれ、そのごく一部のみがメモリに保持されるため、一連の計算全体をこれらの配列の 1 つに実行できるはずです。

于 2011-04-04T11:22:56.880 に答える
8

Python によって課されるメモリ制限はありません。ただし、MemoryErrorRAM が不足すると、 が表示されます。に 20301 個の要素があると言いますlist。これは、単純なデータ型 ( など) のメモリ エラーを引き起こすには小さすぎるように見えますintが、各要素自体が多くのメモリを占有するオブジェクトである場合は、メモリが不足している可能性があります。

ただし、IndexErrorこれはおそらく、ListTemp19767 個の要素 (0 から 19766 までのインデックス) しかなく、最後の要素を超えてアクセスしようとしているために発生します。

何をしようとしているのかを正確に知らずに、限界に達するのを避けるために何ができるかを言うのは難しい. を使用numpyすると役立つ場合があります。膨大な量のデータを保存しているようです。すべての段階ですべてを保存する必要はないかもしれません。でも、知らないとなんとも言えません。

于 2011-04-04T11:15:25.447 に答える