web-dev-qa-db-ja.com

2つのPandasデータフレームをマージするときのMemoryError

私はほとんどインターネットで検索しましたが、どういうわけか私のアプローチではうまくいかないようです。

2つの大きなcsvファイルがあります(それぞれ100万行以上、サイズが約300〜400MB)。 read_csv関数を使用して、chunksizeパラメーターを使用せずに、データフレームに正常にロードしています。新しい列の生成、フィルタリングなど、このデータに対して特定のマイナーな操作を実行しました。

ただし、これら2つのフレームをマージしようとすると、MemoryErrorが返されます。マージを達成するためにSQLiteを使用しようとしましたが、無駄でした。操作は永遠にかかります。

私のものは、8GB RAMを備えたWindows 7 PCです。 Pythonバージョンは2.7

ありがとうございました。

編集:私もチャンク方法を試してみました。これを行うと、MemoryErrorは発生しませんが、RAM使用が爆発し、システムがクラッシュします。

19
Ronit Chidara

Pandas.mergeを使用してデータをマージする場合、df1メモリ、df2メモリ、merge_dfメモリを使用します。メモリエラーが発生する理由だと思います。 df2をcsvファイルにエクスポートし、chunksizeオプションを使用してデータをマージする必要があります。

より良い方法かもしれませんが、これを試すことができます。 *大きなデータセットの場合、pandas.read_csvでchunksizeオプションを使用できます

df1 = pd.read_csv("yourdata.csv")
df2 = pd.read_csv("yourdata2.csv")
df2_key = df2.Colname2

# creating a empty bucket to save result
df_result = pd.DataFrame(columns=(df1.columns.append(df2.columns)).unique())
df_result.to_csv("df3.csv",index_label=False)

# save data which only appear in df1 # sorry I was doing left join here. no need to run below two line.
# df_result = df1[df1.Colname1.isin(df2.Colname2)!=True]
# df_result.to_csv("df3.csv",index_label=False, mode="a")

# deleting df2 to save memory
del(df2)

def preprocess(x):
    df2=pd.merge(df1,x, left_on = "Colname1", right_on = "Colname2")
    df2.to_csv("df3.csv",mode="a",header=False,index=False)

reader = pd.read_csv("yourdata2.csv", chunksize=1000) # chunksize depends with you colsize

[preprocess(r) for r in reader]

これにより、マージされたデータがdf3として保存されます。

17
T_cat