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) |