2017-07-12 18 views
1

これは重複した質問であれば事前にご容赦ください - 私はstackoverflowを検索しましたが、この方法は尋ねられませんでした。メモリ不足のためPythonがクラッシュするコンピュータ

私はコンピュータ上でPython 2.7を実行しています。私は800万行のデータセットで作業を開始しています。コンピュータのメモリが不足しているというエラーメッセージが表示されます。私はデータセットをアップロードする瞬間にこのメッセージを受け取ります_私はそれを処理し始めません。

実際に私のコンピュータ全体が何度かクラッシュしました。これは私の仕事用コンピュータなので、私は仮想メモリをきれいにするようにITに頼んだり、どんなメモリを増やしたり、HDをきれいにすることさえできます。しかし、私はまだその問題にぶつかっています。個人的な設定では、この問題を解決するためにAWSのpython jupyterノートブックを使用しましたが、私はこのオプションを使用していません。

お勧めですか? pysparkは最善の方法ですか?私はスパークするために新しい、スパークのためのジュピターノートに似た何かがある?

は非常に多くの

+1

あなたが行 – Alessandro

+0

のランダムなサブセットを選んで、あなたのデータセットをダウンサンプリング開始することができますまたはあなたが処理できますあなたのデータをまとめることで、不要な列をすべての行から削除するなどのことができます。詳細を知らなければ、新しいツールを見つけることなくこの問題を解決することができます。 – wflynny

+0

残念ながらデータをダウンサンプリングすることはできません - 要件は実際のものです - 800万行はすでにチャンクです - 私はマージするような複数のデータセットを持っています。私は顧客の旅を確立しようとしています。そのためには、すべての取引履歴が必要です - すべての取引 – jeangelj

答えて

1

TLをありがとう; DR:チャンクで読み、またはmmapを試してみてくださいどちらか。

これは実際にはRAMよりも多くのデータをメインメモリにロードしようとしているように見えるので、これはほとんどPythonに依存しません。お使いのオペレーティングシステムは、余分なデータや不必要なデータをハードディスク/ ssdに格納することで対処しようとしています(単一のCPU Skylakeシステムは30GB /秒以上、NVMe SSDは2GB /秒以上になる可能性があります)。通常のHDDは0.1GB/sの範囲内にあります]。 Windowsはこの仮想メモリを呼び出し、Linuxではスワップし、Macではわからない。

通常の解決策は、データをチャンクで処理することです。

何百万行ものテキストファイルがあり、一度に1行ずつ処理できるとします。いくつかのPerl的擬似コード:あなたがやろう何

$FH = open ("myhugefile"); 
while ($line = getLine ($FH)) { 
    process ($line); 
} 
close $FH; 

はもっとこのようなことのようです:

$FH = open ("myhugefile"); 
$array = new Array(); 
while ($line = getLine ($FH)) { 
    push ($array, $line); 
} 
close $FH; 
foreach ($line in $array) { 
    process ($line); 
} 

$arrayがメモリに格納されているので、第二のアプローチは、巨大なデータセットを持ついくつかの問題を持っています。

もちろん、process() -functionでもロットのデータが生成される可能性があります。だから、それをメモリに保存するのではなく、HDD/SSDに書き出す必要があるかもしれません。

コンパイラの構築講義では、別の生徒がmmapを使用してファイルをパーサに読み込んでいます。これは、非常にであることが判明しました。しかし、最初の割り当てでは他のものと比べて高速でした(ただし、実際の処理が悪い/単純な実装のために遅いため、後の割り当てに追いついていました)。

とにかく、mmapの背後にある基本的な考え方は、オペレーティングシステムが自分のファイルを自分のメモリにマップできるようにすることです。通常のメモリオブジェクトのようにアクセスできますが、コンテンツは動的にロードされます。

一般的な説明はWikipediaで見つけることができます:例とhttps://en.wikipedia.org/wiki/Mmap

Python2のドキュメント:https://docs.python.org/2/library/mmap.html (とても簡単に思える)

+0

ありがとう - これは非常に役に立ちます。私はそれをすべて試してみます – jeangelj

+0

あなたは大歓迎です。さらなる研究のために:DBMSの構築を見てみることもできます。つまり、(a)非常に高速で、(b)膨大な量のデータを処理できるSQL文から処理パイプラインを生成する方法です。それらの人は多くの素敵なトリックを持っています(しかし、いくつかはやや複雑でおそらく過剰です)。大きなデータ(例: hadoopや他のmap-reduce実装も同様の問題に直面しています。あなたはそのようなものを使うことができますか? – ArchimedesMP

+0

私は、おそらくSparkを使って、私が使うことができるハーフープのインフラストラクチャを持っています。しかし、私はPythonで方法がないかどうかを理解したかった - 私は確かにチャンクとmmapのアプローチを試してみます。私は最終的にデータセットが毎年増えているので、スパークに移行する必要があると思います。ありがとうございました – jeangelj

関連する問題