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 (とても簡単に思える)
あなたが行 – Alessandro
のランダムなサブセットを選んで、あなたのデータセットをダウンサンプリング開始することができますまたはあなたが処理できますあなたのデータをまとめることで、不要な列をすべての行から削除するなどのことができます。詳細を知らなければ、新しいツールを見つけることなくこの問題を解決することができます。 – wflynny
残念ながらデータをダウンサンプリングすることはできません - 要件は実際のものです - 800万行はすでにチャンクです - 私はマージするような複数のデータセットを持っています。私は顧客の旅を確立しようとしています。そのためには、すべての取引履歴が必要です - すべての取引 – jeangelj