我使用这个简单的代码,观察内存使用的单调增长。我用这个小模块把数据转储到磁盘上。我观察到unicode字符串会发生这种情况,而不是整数,有什么地方我做错了吗?在
当我这样做的时候:
>>> from utils.diskfifo import DiskFifo
>>> df=DiskFifo()
>>> for i in xrange(1000000000):
... df.append(i)
内存消耗稳定
但当我这么做的时候:
^{pr2}$它到了屋顶。有什么提示吗?在模块下面。。。在
import tempfile
import cPickle
class DiskFifo:
def __init__(self):
self.fd = tempfile.TemporaryFile()
self.wpos = 0
self.rpos = 0
self.pickler = cPickle.Pickler(self.fd)
self.unpickler = cPickle.Unpickler(self.fd)
self.size = 0
def __len__(self):
return self.size
def extend(self, sequence):
map(self.append, sequence)
def append(self, x):
self.fd.seek(self.wpos)
self.pickler.dump(x)
self.wpos = self.fd.tell()
self.size = self.size + 1
def next(self):
try:
self.fd.seek(self.rpos)
x = self.unpickler.load()
self.rpos = self.fd.tell()
return x
except EOFError:
raise StopIteration
def __iter__(self):
self.rpos = 0
return self
pickler模块存储它在其memo中看到的所有对象,因此不必对同一个对象进行两次pickle。您希望跳过此操作(因此对对象的引用不会存储在pickler对象中),并在转储之前清除备注:
来源:http://docs.python.org/library/pickle.html#pickle.Pickler.clear_memo
编辑: 通过使用以下append函数,您可以实际观察备忘录的大小随着pickle对象的增加而增大:
^{pr2}$相关问题 更多 >
编程相关推荐