我搜索了几乎所有的互联网,不知何故,这些方法似乎都不适用于我的情况。
我有两个大的csv文件(每个文件有一百万+行,大小约为300-400MB)。它们使用 read_csv 函数正确加载到数据框中,而无需使用 chunksize 参数。 我甚至对这些数据进行了一些小的操作,比如新的列生成,过滤等等。
但是,当我尝试合并这两个帧时,我得到一个 MemoryError 。我甚至尝试使用SQLite来完成合并,但是徒劳无功。这项行动需要永远。
我是一台装有8GB RAM的Windows 7 PC。 Python版本是2.7
谢谢。
编辑:我也试过了分块方法。当我这样做时,我没有得到MemoryError,但RAM使用率爆炸,我的系统崩溃。
答案 0 :(得分:13)
使用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。
答案 1 :(得分:2)
获得MemoryError: Unable to allocate..
的原因可能是由于数据框中的重复项或空白。检查您要加入的列(使用合并时),查看是否有重复或空白。如果是这样,请使用以下命令清除它们:
df.drop_duplicates(subset ='column_name', keep = False, inplace = True)
然后重新运行您的python / pandas代码。这对我有用。
答案 2 :(得分:0)
@T_cat建议的一般块版本效果很好。
但是,内存爆炸可能是由于联接具有Nan
值的列而引起的。
因此,您可能要从联接中排除那些行。
请参阅:https://github.com/pandas-dev/pandas/issues/24698#issuecomment-614347153
答案 3 :(得分:-1)
也许左边的数据框在合并列中有 NaN,这会导致最终合并的数据框膨胀。
如果没问题,用零填充左侧数据框中的合并列。
df['left_column'] = df['left_column'].fillna(0)
然后进行合并。看看你得到了什么。