python吃内存吗_python – 为什么泡菜吃内存?

我试图通过小块来处理将大量的腌制数据写入磁盘.这是示例代码:

from cPickle import *

from gc import collect

PATH = r'd:\test.dat'

@profile

def func(item):

for e in item:

f = open(PATH, 'a', 0)

f.write(dumps(e))

f.flush()

f.close()

del f

collect()

if __name__ == '__main__':

k = [x for x in xrange(9999)]

func(k)

内置循环中的open()和close()可以排除内存中数据累积的可能原因.

为了说明问题,我附上了使用Python 3d party模块memory_profiler获得的内存分析结果:

Line # Mem usage Increment Line Contents

==============================================

14 @profile

15 9.02 MB 0.00 MB def func(item):

16 9.02 MB 0.00 MB path= r'd:\test.dat'

17

18 10.88 MB 1.86 MB for e in item:

19 10.88 MB 0.00 MB f = open(path, 'a', 0)

20 10.88 MB 0.00 MB f.write(dumps(e))

21 10.88 MB 0.00 MB f.flush()

22 10.88 MB 0.00 MB f.close()

23 10.88 MB 0.00 MB del f

24 collect()

在执行循环期间,发生奇怪的内存使用增长.如何消除它?有什么想法吗?

当输入数据量增加时,此附加数据的数量可以增大到大于输入的大小(upd:在实际任务中我得到300 Mb)

更广泛的问题 – 在Python中正确处理大量IO数据的方法有哪些?

UPD:

我重新编写了代码,只留下循环体,看看生长发生的具体时间,结果如下:

Line # Mem usage Increment Line Contents

==============================================

14 @profile

15 9.00 MB 0.00 MB def func(item):

16 9.00 MB 0.00 MB path= r'd:\test.dat'

17

18 #for e in item:

19 9.02 MB 0.02 MB f = open(path, 'a', 0)

20 9.23 MB 0.21 MB d = dumps(item)

21 9.23 MB 0.00 MB f.write(d)

22 9.23 MB 0.00 MB f.flush()

23 9.23 MB 0.00 MB f.close()

24 9.23 MB 0.00 MB del f

25 9.23 MB 0.00 MB collect()

似乎dumps()吃掉了内存. (虽然我实际上认为它会写())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值