Python队列在get()之后不会释放内存

时间:2017-12-28 23:24:20

标签: python multithreading memory queue

我需要你关于队列记忆的帮助。 1)我选择Queue作为我的数据结构,因为我有一个线程将数据提供给队列,另一个线程将获取数据 2)两个线程设计为运行数天 3)我不想限制队列大小,队列的大小可能很长,比如10k,占用10GB。这可以 4)问题是当我用get()将q大小缩小到仅20个内存时只占用约100MB的项目时。我打印尺寸,我确定只有20件。 5)但在系统级,整个过程仍然占用~10GB

我试着打电话

gc.collect()
我自己记忆并没有改变。所以我的猜测是来自get()的那些项被破坏了。 并且线程始终在运行,而python不会减少队列的容量。

我的问题是:是否有任何方式可以释放队列目前尚未使用的内存?我无法找到任何api来做到这一点。

更新1

Ubuntu 16.04,python 2.7.12 我今天做了一些实验。我的观察是q大小是空的,但系统内存占用大约84M。这是一些重现我的结果的代码。

第一次拍摄:del

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

第四次拍摄:gc.collect()

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队列是这样设计的?

1 个答案:

答案 0 :(得分:0)

q.task_done()之后调用q.get()

参考: https://docs.python.org/3/library/queue.html#queue.Queue.task_done

此外,请看: https://bugs.python.org/issue43911