我需要你关于队列记忆的帮助。 1)我选择Queue作为我的数据结构,因为我有一个线程将数据提供给队列,另一个线程将获取数据 2)两个线程设计为运行数天 3)我不想限制队列大小,队列的大小可能很长,比如10k,占用10GB。这可以 4)问题是当我用get()将q大小缩小到仅20个内存时只占用约100MB的项目时。我打印尺寸,我确定只有20件。 5)但在系统级,整个过程仍然占用~10GB
我试着打电话
gc.collect()
我自己记忆并没有改变。所以我的猜测是来自get()的那些项被破坏了。
并且线程始终在运行,而python不会减少队列的容量。
我的问题是:是否有任何方式可以释放队列目前尚未使用的内存?我无法找到任何api来做到这一点。
Ubuntu 16.04,python 2.7.12 我今天做了一些实验。我的观察是q大小是空的,但系统内存占用大约84M。这是一些重现我的结果的代码。
import Queue
q = Queue.Queue()
length = 10000000
buffer_size = 1000
index = 0
while index < length:
q.put_nowait(1)
index += 1
key = raw_input('finish insert, press key to pop')
while q.qsize() > buffer_size:
a = q.get()
del a
print 'after pop, q size = ', q.qsize()
raw_input('let me del the q')
del q
key = raw_input('finish delete')
import Queue
q = Queue.Queue()
length = 10000000
buffer_size = 1000
index = 0
while index < length:
q.put_nowait(1)
index += 1
key = raw_input('finish insert, press key to pop')
while q.qsize() > buffer_size:
a = q.get()
del a
print 'after pop, q size = ', q.qsize()
raw_input('let me del the q')
with q.mutex:
q.queue.clear()
print 'q size = ', q.qsize()
key = raw_input('finish delete')
import Queue
q = Queue.Queue()
length = 10000000
buffer_size = 1000
index = 0
while index < length:
q.put_nowait(1)
index += 1
key = raw_input('finish insert, press key to pop')
while q.qsize() > buffer_size:
a = q.get()
del a
print 'after pop, q size = ', q.qsize()
raw_input('let me del the q')
q = Queue.Queue()
print 'q size = ', q.qsize()
key = raw_input('finish delete')
import Queue
import gc
q = Queue.Queue()
length = 10000000
buffer_size = 1000
index = 0
while index < length:
q.put_nowait(1)
index += 1
key = raw_input('finish insert, press key to pop')
while q.qsize() > buffer_size:
a = q.get()
del a
print 'after pop, q size = ', q.qsize()
raw_input('let me del the q')
#del q
#with q.mutex:
# q.queue.clear()
q = Queue.Queue()
print 'q size = ', q.qsize()
raw_input('let me gc.collect')
gc.collect()
raw_input('how about now?')
这四种方式不会释放队列中的内存。任何人都可以告诉我我做错了什么?非常感谢!
看起来像python Queue将保留其生命周期中最大的内存容量,并尝试在没有malloc内存的情况下重用内存。与C ++ stl向量中的数据结构相比较。当(size == capacity)时将内存加倍并将容量减少到一半(size / capacity == 0.25)。我希望动态数据结构具有此功能。 有什么办法可以吗?或者python队列是这样设计的?
答案 0 :(得分:0)
在q.task_done()
之后调用q.get()
参考: https://docs.python.org/3/library/queue.html#queue.Queue.task_done