drop_duplicates期间和之后的内存使用情况()

Memory usage during and after drop_duplicates()

提问人:isalteverything 提问时间:10/10/2014 更新时间:9/3/2023 访问量:1777

问:

我正在处理一个数据帧,该数据帧占用大约 2 Gb 的内存(根据 htop),尺寸为 (6287475,19)。数据帧在数据类型上是异构的,这可能无关紧要。加载数据框后,我立即使用命令删除重复的行

df.drop_duplicates(inplace=True)

在执行此命令期间,内存使用率跳转到大约 7 Gb。命令完成后,内存将减少到近 5 Gb,这是存储数据帧的单个实例所需内存的两倍多。如果我随后删除数据帧,内存使用量将减少到大约 3 Gb。del df

如果我执行以下操作,则行为相同:

df2 = df.drop_duplicates
del df
del df2

运行不执行任何操作,并且终止 python 会话后,内存使用量将恢复到其基线水平。这看起来像是内存泄漏吗?有没有人看到过类似的行为?gc.collect()

环境:

  • 64 位 Linux
  • Python 2.7.7(64 位)
  • 熊猫 0.14.1
  • numpy 1.8.2
  • Ipython 2.2.0(与 cpython 的行为相同)
python-2.7 熊猫

评论

1赞 Jeff 10/10/2014
就地传递并不意味着事情实际上已经到位,事实上,这必须制作一个副本才能正常运行。(它还构造了一个布尔数组来索引,因此它的大小与你的 DF 相同,但布尔 dtype)。所以我想说你的内存使用量与预期差不多。请注意,python 不一定会将内存返回(通常不会)给操作系统。 这里没有泄漏。
0赞 Jeff 10/10/2014
为了降低内存使用率,应该做的是这样的(假设您从 csv 开始)。使用合理的块大小(比如 1M)进行块读取,然后在该块上删除重复项(取决于您的 dup 所在的位置,这可能会删除很多或仅删除一小部分 dup)。然后连接块。drop_duplicates又来了。
0赞 isalteverything 10/10/2014
谢谢你,杰夫。我会采纳您的建议并执行分块重复丢弃。干杯!
0赞 Crispy Holiday 9/28/2023
如果可能的话,另一个建议是使用 Polars,它可以进行大于内存的操作

答: 暂无答案