Bài viết phổ biến của tác giả
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用这个简单的代码并观察单调增加的内存使用量。我正在使用这个小模块将内容转储到磁盘。我观察到它发生在 unicode 字符串上而不是整数上,我做错了什么吗?
当我这样做时:
>>> from utils.diskfifo import DiskFifo
>>> df=DiskFifo()
>>> for i in xrange(1000000000):
... df.append(i)
内存消耗稳定
但是当我这样做的时候:
>>> while True:
... a={'key': u'value', 'key2': u'value2'}
... df.append(a)
它到达屋顶。有什么提示吗?在模块下面...
import tempfile
import cPickle
class DiskFifo:
định nghĩa __init__(bản thân):
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):
thử:
self.fd.seek(self.rpos)
x = self.unpickler.load()
self.rpos = self.fd.tell()
trả lại x
except EOFError:
raise StopIteration
def __iter__(self):
self.rpos = 0
trả lại chính mình
câu trả lời hay nhất
pickler 模块存储它在其备忘录中看到的所有对象,因此它不必对同一事物进行两次 pickle。你想跳过这个(所以对你的对象的引用不会存储在你的 pickler 对象中)并在转储之前清除备忘录:
def append(self, x):
self.fd.seek(self.wpos)
self.pickler.clear_memo()
self.pickler.dump(x)
self.wpos = self.fd.tell()
self.size = self.size + 1
nguồn:http://docs.python.org/library/pickle.html#pickle.Pickler.clear_memo
编辑:您实际上可以看到备忘录的大小随着您使用以下追加函数 pickle 对象而增加:
def append(self, x):
self.fd.seek(self.wpos)
print len(self.pickler.memo)
self.pickler.dump(x)
self.wpos = self.fd.tell()
self.size = self.size + 1
关于Python单调增加内存使用量(泄漏?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6857006/
我正在寻找一种快速方法来使 pandas 数据帧在 x 中单调。 我当前的解决方案如下: def make_monotonic(df, cols=None): """make df monot
CLOCK_REALTIME 的一个问题是它不是单调的,如果发生 NTP 同步,时间可能会倒退。 像下面这样的事情让它变得单调是否安全? struct timespec GetMonotonicTim
Tôi là một lập trình viên xuất sắc, rất giỏi!