2016-08-06 13 views
2

ディレクトリ内のすべてのcsvファイルを取り込んで、外部結合を使用してそれらを並べてマージするスクリプトがあります。問題は、自分のコンピュータのチョーク(MemoryError)が、私が参加する必要のあるファイル(約6-12Gbのファイルが約2ダース)に使用しようとすることです。私はitertoolsを使ってループをより効率的にすることができることを知っていますが、この状況に適用できるかどうか、またどのように適用できるかは不明です。私が考えることのできるもう1つの方法は、mySQLをインストールし、基本を学び、これを実行することです。私はすでにそれを学んでいるので、明らかに私はむしろPythonでこれを行うだろう。 Rベースの解決策も受け入れられるだろう。ここで多くの巨大なcsvファイルの効率的なマージ

私のコードです:

import os 
import glob 
import pandas as pd 
os.chdir("\\path\\containing\\files") 

files = glob.glob("*.csv") 
sdf = pd.read_csv(files[0], sep=',') 

for filename in files[1:]: 
    df = pd.read_csv(filename, sep=',') 
    sdf = pd.merge(sdf, df, how='outer', on=['Factor1', 'Factor2']) 

私のコンピュータのメモリには大きすぎるファイルでこれを行う方法について何かアドバイスをいただければ幸いです。

答えて

4

使用は、私の意見で、それは非常によくあなたのニーズに合うでしょう。 out-of-core queriesも処理されるので、MemoryErrorに直面する必要はありません。

import os 
import glob 
import pandas as pd 
os.chdir("\\path\\containing\\files") 

files = glob.glob("*.csv") 
hdf_path = 'my_concatenated_file.h5' 

with pd.HDFStore(hdf_path, mode='w', complevel=5, complib='blosc') as store: 
    # This compresses the final file by 5 using blosc. You can avoid that or 
    # change it as per your needs. 
    for filename in files: 
     store.append('table_name', pd.read_csv(filename, sep=','), index=False) 
    # Then create the indexes, if you need it 
    store.create_table_index('table_name', columns=['Factor1', 'Factor2'], optlevel=9, kind='full') 
+1

は、一連のエラーを投げました。その最初のものは次のとおりです。 'run 282、run_code exec(code_obj、self.user_global_ns、self.user_ns)の行2885 ' – Thoughtcraft

+0

going csv - > hdf5 - > csvもう一度対処するには時間がかかるでしょうか?もし私ができるなら、私はCSV - > CSVに行こうとします。 – Kosch

+0

本当ではありません。私のテストでは、HDF5はcsvよりも少なくとも10倍高速です。さらにOPは、出力がcsvでなければならないと言及していない。 OPが処理しなければならないファイルは6〜12GBなので、他の実装ではループを含む非常に精巧なアルゴリズムが必要です。したがって、OPがスーパーコンピュータ上になければ、それほど多くのRAMを持つ可能性はありません。 – Kartik

0

チャンスがありますdaskあなたの使用に適しています。それは、マージ後に何をしたいかによって異なる場合があります。

+0

私はそれを1つの巨大なcsvに保存します。 – Thoughtcraft

0

あなたはpythonでこれを行うことができるはずですが、私はcsvを一度に読むことがあなたのメモリの最も効率的な使用になるとは思わない。

How to read a CSV file from a stream and process each line as it is written?

+0

ストリームの仕組みを理解しているかどうかはわかりませんが、単純に行を連結するのではなく、異なるファイルの同じキーの有無によって行がどのように変わるかが問題になると思います整列する。 – Thoughtcraft

+0

あなたはそれがメモリに収まる限り、何でもできます。必要なビットだけを読み込み、必要に応じて読み込み、ディスクに完全/一致するものをフラッシュします。 – Kosch

関連する問題