gpt4 book ai didi

Python Queue 在 get() 后不会释放内存

转载 作者:行者123 更新时间:2023-12-05 07:38:18 26 4
gpt4 key购买 nike

关于队列内存,我需要你的帮助。1)我选择队列作为我的数据结构,因为我有一个线程将数据馈送到队列,另一个线程将获取数据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')

第二次拍摄:clear()

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

第三次拍摄:Queue()

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 vector 中的数据结构为例进行比较。当 (size == capacity) 时将内存加倍,如果 (size/capacity == 0.25) 则将容量减半。我期望动态数据结构会有这个特性。有什么办法可以做到吗?还是python队列就是这么设计的?

最佳答案

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

引用: https://docs.python.org/3/library/queue.html#queue.Queue.task_done

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

关于Python Queue 在 get() 后不会释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48015613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com