
df = pd.DataFrame() df 大概用了 1.5GB 内存 然后我 df = df.loc[xxx] df 切片为原来的 10 分之一,用 sys.getsizeof(df) df 内存为 100 多 MB,但是 python 的内存还是 1.5G+, 怎么会这样呢? 用了 gc.collect()也是不行
1 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 |
2 djj510620510 2020-01-17 10:02:38 +08:00 |
3 wuwukai007 OP @djj510620510 切片后内存确实是少了 但是你看 python 的内存,没释放 |
4 wuwukai007 OP 在 ipython 里面,这样操作后,切片后的内存对象小了, 但是查看当前 python 占用内存,还是 切片之前的 |
5 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() |
6 Kelan 2020-01-17 11:29:50 +08:00 python 就有这种问题,如果运算过程对内存很紧张的话,建议开子进程,用完销毁 |
7 zk8802 2020-01-17 11:33:46 +08:00 via iPhone IPython 的 In 与 Out 是不是保持了切片之前的数组的引用?试试 IPython.display.clear_output() |
8 jyyx 2020-01-17 11:46:49 +08:00 用 ipython 你可以看下 globals()里面还有原来的变量 |
9 wuwukai007 OP @Kelan @djj510620510 @zk8802 用了一个曲线的方法, df2 = df.loc[:100].copy() del df 但是有一个问题,如果切片的数据也是很多的话比如源数据 1.5G 切一般, 这样曲线做还是会临时增加 800MB 的内存。。。。 |
10 wuwukai007 OP |
11 zk8802 2020-01-17 13:08:11 +08:00 via iPhone 试试强制 garbage collection: import gc; gc.collect() |
12 cheng6563 2020-01-17 13:46:19 +08:00 不懂 python,会不会是 gc 回收内存后不会实时把内存还给操作系统。 |
13 TPOB 2020-01-17 15:37:22 +08:00 我之前也遇到过类似的情况,后来像楼上说的用子进程了 |
14 jyyx 2020-01-17 15:47:14 +08:00 我试了下的确用切片会有问题 df = df.loc[xxx, :] 这样写会有问题 可以试下改成 df.drop(xxxx, inplace=True) |