pandas 合并占用太多内存

cedebl8k  于 2022-12-09  发布在  其他
关注(0)|答案(1)|浏览(152)

我尝试在Pandas中执行我认为非常简单的操作,即合并3个 Dataframe 。
在我们进入其他工具之前,我已经尝试过Polars,我已经尝试过R data.table,我已经尝试过Dask,我甚至尝试过在第二次合并之前使用gc.collect()。我已经尝试了我在Stackoverflow上能找到的大多数解决方案,但都无济于事。我无法理解它是如何在每个示例中耗尽内存的。
我从TSV文件创建了3个 Dataframe ,总共不到2GB的空间。我从每个文件中删除了多个列,并对三个 Dataframe 进行了简单的内部连接,这如何每次使用64 GB以上的RAM?
当我创建前3个 Dataframe 并删除无关的列时,根据free -h,我已经使用了18 GB的内存,还剩下40 GB。
dfcombined = df1.merge(df2, left_on="key1", right_on="key2", how="inner")
在此之后,我还运行del df1, df2; gc.collect()
这两个最大的 Dataframe 的合并是成功的,在这一点上,我从40 GB的空闲内存到38 GB的空闲。但由于某种原因,当我试图加入第三个(和最小的) Dataframe ...
combine = dfcombined.merge(df3, left_on="key1", right_on="key3", how="inner")
我不断地得到一个OOM错误。我想这可能与这些 Dataframe 如何通过引用原始 Dataframe 有关?我真的被难住了,我已经在这个问题上花了几个小时。
dfcombined的形状是(20786437, 32),df 3的形状是(2370993, 5)df3dfcombined有很多匹配,但不应该多到占用64 GB。
dtype也可能非常昂贵,因为我会将大多数列设置为字符串。
df3看起来像(所有字段都需要是字符串,最后一个字段不是数字):

index key1 field1 field2 field3 field4 field4
0 "ID1" "A string value" "S" "2" "n/a"
1 "ID1" "Another string" "R" "1" "7/2"
2 "ID1" "New string" "R" "1" "7/2"
3 "ID2" "First string value" "R" "1" "7/2"

dfcombined有许多性质相似的字符串列,前74行有相同的key1,所以这里有一个多对多连接。这可以解释合并大小的放大,但到了这种程度?
编辑1:在与@chrslg交谈后,我应该说在dfcombine中有1151147唯一键,在df3中有139162唯一键,OOM错误现在看起来不像是假设而更像是事实。请参考我们的聊天here

b09cbbtk

b09cbbtk1#

在上面链接的聊天中与@chrslg讨论后,我决定将dfcombinedf3分开使用(在某些情况下,甚至将df1df2单独使用)。
将其视为SQL并执行类似于SELECT的查询,然后执行JOIN很可能是最佳实践。如果有人找到不同的解决方案,我很乐意将其保留为开放式,但这是我最终得到的答案。

相关问题