パンダread_csvをチャンクサイズ500000で使用し、別のcsvファイルに書き出すことで、7億5000万行のCSVを豊かにしています。これを実行すると、約1億〜1億5千万の行を処理した後に「セグメント化エラー」が発生します。チャンクサイズのメモリリークのパンダread_csv
処理されたチャンクの数を追跡し、コードを変更して、読み取ったチャンクをスキップします。プロセスのメモリ消費量を監視する私は、チャンクをスキップしていても、それが大きく増加することがわかります。それは私が得ない部分です。そこを尋ねると、パンダのガベージコレクションに問題があるようですが、これは以前のバージョンに関連しているようです。私もメモリを6倍までのアカウントのパンダを考慮して、Pythonの2.7とパンダ0.21.0
私は十分なはず30ギガバイトのRAMを搭載したr3.xlargeのEC2インスタンス上でこれをやっているを使用していますオーバーヘッド。
コードの要約:
i = 0
for chunk in pd.read_csv(filename,chunksize=500000,names=colnames):
if i <= 349500000: # Previously processed chunks
i = i+chunksize
print 'Skipping chunk ', i
continue
enriched_chunk = enrich_df(chunk, users_df)
enriched_chunk.to_csv('enriched.csv', mode='a', header=False, index=False)
def enrich_df(c, users_df):
d = pd.merge(c, users_df, how='left', left_on='user_id', right_on='userId')
return d
テーブルusers_dfはメモリに保持され、比較的小さなテーブルです。