2016-11-02 8 views
0

私はcsvを読むためにパンダを使用しています。パンダメモリエラーwhile pd.concat

df_from_each_file = (pd.read_csv(StringIO(f)), compression='gzip', dtype=str) for f in all_files) 
final_df = pd.concat(df_from_each_file, ignore_index=True) 

各ファイルのサイズは小さくても、all_filesの合計行は約90,000,000です。

pd.concatが実行されている場合、Memory Errorを挙げて失敗しています。

システムには16GBのRAMと16個のCPUの2GHZがあります。ここにはメモリが不足していますか? は私がMemoryErrorを削除するために行うことができます何かはありますか?

私はchunksizeなどについて読んでいますが、それぞれのファイルは小さく、問題ではありません。どのようにconcatをmemoryerrorできますか?

これはトレースバックです。 1つのファイルの

final_df = pd.concat(df_from_each_file, ignore_index=True) 
File "/home/jenkins/fsroot/workspace/ric-dev-sim-2/VENV/lib/python2.7/site-packages/pandas/tools/merge.py", line 1326, in concat 
return op.get_result() 
File "/home/jenkins/fsroot/workspace/ric-dev-sim-2/VENV/lib/python2.7/site-packages/pandas/tools/merge.py", line 1517, in get_result 
copy=self.copy) 
File "/home/jenkins/fsroot/workspace/ric-dev-sim-2/VENV/lib/python2.7/site-packages/pandas/core/internals.py", line 4797, in concatenate_block_managers 
placement=placement) for placement, join_units in concat_plan] 
File "/home/jenkins/fsroot/workspace/ric-dev-sim-2/VENV/lib/python2.7/site-packages/pandas/core/internals.py", line 4902, in concatenate_join_units 
concat_values = _concat._concat_compat(to_concat, axis=concat_axis) 
File "/home/jenkins/fsroot/workspace/ric-dev-sim-2/VENV/lib/python2.7/site-packages/pandas/types/concat.py", line 165, in _concat_compat 
return np.concatenate(to_concat, axis=axis) 
MemoryError 

df.infoは

dtype: object<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 12516 entries, 0 to 12515 
Columns: 322 entries, #RIC to Reuters Classification Scheme.1 
dtypes: object(322) 
memory usage: 30.7+ MB 
None 
+0

@WesMcKinney任意の提案??????? – vks

+0

いくつの列がありますか?私が約3,800万行のデータフレームと約50個のカラムをメモリに持っていると、私のRAMは32GB以上になります。私は64ギガバイトを持っていると私はどんな試みたマージにメモリが不足すると思いますので、私は、このデータフレーム上で動作する任意のマージ操作を行うことはできません。 – Khris

+0

ああ、9000万ではない。私はあなたの変わった桁の「90,00,000」を混乱させました。 – Khris

答えて

1

あるまず第一に、あなたが本当にそれを必要としない限り、dtype=strパラメータを使用しないでください。

あなたがこのアプローチを使用する場合は、9M行(結果のDFプラスあなたが連結されているのDFのリストのリスト90ギガバイトのための90ギガバイト)のためにRAMの少なくとも2 * 90ギガバイト= 180ギガバイトが必要になりますyour next questionを見る:

計算17.1GB/1713078 * (9*10**6)/1GB

In [18]: 17.1*1024**3/1713078*(9*10**6)/1024**3 
Out[18]: 89.8382910760631 

ですから、あなたのデータファイルあたりのファイルを処理する必要がありますと、このようなデータの量を扱うことができます何かにそれを保存するために - 私は、MySQL/PostgreSQLのようHDFまたはデータベースのいずれかを使用します/ etc .:

fn = r'c:/tmp/test.h5' 
store = pd.HDFStore(fn) 

df = pd.DataFrame() 
for f in all_file_names: 
    x = pd.read_csv(f) 
    # process `x` DF here 
    store.append('df_key', df, data_columns=[<list_of_indexed_columns>], complib='blosc', complevel=5) 

store.close() 
+0

mmそれはMemoryError.Thanxを説明しています....私はこのapporachを使用することはできませんが、フレームは1つの処理で処理されなければならない..... – vks