2010-12-14 11 views
21

私は大量のデータ辞書をテキストファイルから構築しています。私が行を読んでそれらを処理するとき、私はappend(dataline)をリストに入れます。リストの `append()`に多くのRAMが残っているPython `Memory Error`が残っています

ある時点で、append()Memory Error例外を生成します。しかし、プログラムがWindowsタスクマネージャーで実行されているのを見て、クラッシュの時点で私は利用可能な4.3 GBと1.1ギガバイトを参照してください。

したがって、私は例外の理由を理解していません。

Pythonバージョンは2.6.6です。私は、唯一の理由は、利用可能なRAMの多くを使用することができないということです。そうであれば、割り当てを増やすことは可能ですか?

+1

64ビットのPythonビルドをお試しください。拡張モジュールを使用している場合は、64ビットも構築する必要があります。 –

+0

'MemoryError'例外文字列を出力できますか?それは私達に多くの情報を与えるはずです。 – chrisaycock

+0

行を処理する前または後に追加していますか? – nmichaels

答えて

27

Pythonの32ビットビルドを使用している場合は、64ビット版をお試しください。

プロセスが32ビットアドレスを使用して最大4GBのRAMをアドレス指定することは可能ですが、通常は(OSによって異なります)、はるかに少なくなります。あなたのPythonプロセスがこの限界に達しているようです。 64ビットアドレッシングはこの制限を解消します。

編集 Windowsについて質問しているので、次のページは関連性があります。Memory Limits for Windows Releasesお分かりのように、32ビットプロセスあたりの制限は、OSのバージョンと構成に応じて2,3または4GBです。

+0

はい、32ビットです。どのくらい割り当てられているかを制御する方法はありますか?または、どれくらい割り当てられているか確認するには?私は限界を打っているかどうかを確認したいと思います。プロセスがクラッシュすると、[タスクマネージャ]ウィンドウで1.9GBを使用していると表示されます。 – Pete

+0

@Peteこれはタスクマネージャで見ることができます:http://upload.wikimedia.org/wikipedia/en/6/6b/System_idle_process.png(「Mem Usage」の下に) – NPE

+0

私は、割り当ての制限が何であるかを見たり、それを変更したりして、メモリが不足していることを確認するのではなく、現在の割り当てである1.9GBを制限しています。 – Pete

4

あなたは、コードの再構築の代わりに、それをより多くのメモリを投げるに開放している場合は、このとによって得ることができるかもしれません:

linesは、行のリストまたは file.xreadlines()または類似のいずれかである
data = (processraw(raw) for raw in lines) 

3

私は64ビットWindows環境で32ビット版のPythonを使用して同様の問題を抱えていました。私は64ビットのWindows版のPythonを試してみましたが、すぐに64ビットのWindows用にコンパイルされたScipyライブラリで問題に遭遇しました。私が実装

完全無料のソリューションは、VM
3)Enthought Pythonのディストリビューションを取得(無料64ビットのLinux版)上のCentOS 5.6をインストールします) 2 VirtualBoxの
をインストールします) をしました。

Numpy、Scipy、Matplotlibに依存するPythonコードのすべては、Ramと利用可能なLinuxスワップと同じくらい多くのメモリを使用できます。

0

すでに言及したように、(64ビットバージョンのWindowsの)python64ビットが必要です。

作業したいと思うかもしれないいくつかの基本的なパッケージの多くの競合および問題に直面することに注意してください。この問題を回避するには、Continuum AnalyticsのAnacondaをお勧めします。私はそれを見てアドバイスをお願いします:)

3

大きなnumpy配列を含む式を評価すると、私は同様の問題が発生しました(実際には1つは疎です)。私は64GBのメモリを搭載したマシンでこれを行っていましたが、そのうち約8GBしか使用されていなかったので、MemoryErrorを得るのに驚いていました。

私の問題はアレイ形状の放送であることが判明しました。私は誤って大きな次元を複製しました。

それはこのような何かに行った:私は(286577)を期待していた形状(286577, 1)を持つ配列を通過した

  • を。
  • これは、形状が(286577, 130)の配列から引き出されました。
  • 私は(286577)を期待していたので、それを(286577,1)に持っていくために[:,newaxis]を適用したので、(286577,130)にブロードキャストされます。
  • しかし、形状(286577,1)を渡したとき、[:,newaxis]は形状(286577,1,1)を生成し、2つの配列は両方ともダブルスの形状(286577,286577,130) ...にブロードキャストされました。 2つのそのような配列では、それは約80GBになる!