为什么泡菜吃内存?

时间:2012-12-14 00:54:39

标签: python performance file-io pickle persistent

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

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

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

当输入数据量增加时,此附加数据的数量可以增大到大于输入的大小(更新:在实际任务中我获得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()吃掉了内存。 (虽然我实际上认为它会写())

0 个答案:

没有答案
相关问题