pandas loc 操作会内存泄漏?

2020-01-17 09:41:33 +08:00
 wuwukai007

df = pd.DataFrame() df 大概用了 1.5GB 内存 然后我 df = df.loc[xxx] df 切片为原来的 10 分之一,用 sys.getsizeof(df) df 内存为 100 多 MB,但是 python 的内存还是 1.5G+, 怎么会这样呢? 用了 gc.collect()也是不行

3418 次点击
所在节点    Python
14 条回复
djj510620510
2020-01-17 10:01:33 +08:00
未复现:
import pandas
import sys

df = pandas.DataFrame([[j for j in range(100)] for i in range(10000)])
print(sys.getsizeof(df)) # 8000104
df = df.loc[:100]
print(sys.getsizeof(df)) # 80904
djj510620510
2020-01-17 10:02:38 +08:00
@djj510620510

是不是 df 里面有 list 或者 dict 之类的引用类型,
wuwukai007
2020-01-17 10:06:22 +08:00
@djj510620510 切片后内存确实是少了
但是你看 python 的内存,没释放
wuwukai007
2020-01-17 10:08:33 +08:00
在 ipython 里面,这样操作后,切片后的内存对象小了,
但是查看当前 python 占用内存,还是 切片之前的
djj510620510
2020-01-17 10:22:28 +08:00
@wuwukai007

啊,我看漏了,的确是内存还是那么多。

不过我再测了一下,如果把处理放到函数里面的话,函数执行完了,内存就会减少:

In [1]: def test():
...: df = pandas.DataFrame([[j for j in range(1000)] for _ in range(10000)])
...: df = df.loc[:100]
...: return df
...:

In [2]:

In [2]: import pandas

In [3]: a = test()
Kelan
2020-01-17 11:29:50 +08:00
python 就有这种问题,如果运算过程对内存很紧张的话,建议开子进程,用完销毁
zk8802
2020-01-17 11:33:46 +08:00
IPython 的 In 与 Out 是不是保持了切片之前的数组的引用?试试 IPython.display.clear_output()
jyyx
2020-01-17 11:46:49 +08:00
用 ipython 你可以看下 globals()里面还有原来的变量
wuwukai007
2020-01-17 11:48:32 +08:00
@Kelan @djj510620510 @zk8802
用了一个曲线的方法,
df2 = df.loc[:100].copy()
del df
但是有一个问题,如果切片的数据也是很多的话比如源数据 1.5G 切一般,
这样曲线做还是会临时增加 800MB 的内存。。。。
wuwukai007
2020-01-17 11:49:09 +08:00
@jyyx @zk8802
不是 ipython 的问题,我在脚本里跑发现这个问题才在 ipython 里面测试的
zk8802
2020-01-17 13:08:11 +08:00
试试强制 garbage collection:
import gc; gc.collect()
cheng6563
2020-01-17 13:46:19 +08:00
不懂 python,会不会是 gc 回收内存后不会实时把内存还给操作系统。
TPOB
2020-01-17 15:37:22 +08:00
我之前也遇到过类似的情况,后来像楼上说的用子进程了
jyyx
2020-01-17 15:47:14 +08:00
我试了下的确用切片会有问题
df = df.loc[xxx, :] 这样写会有问题
可以试下改成 df.drop(xxxx, inplace=True)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/638615

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX