scrapy 使用queuelib保留到磁盘队列的固定大小

bwitn5fc  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(165)

我尝试使用queuelib github来实现一个存储在磁盘中(持久保存到磁盘)的固定大小队列。
代码快照:

from queuelib import FifoDiskQueue
images_data = FifoDiskQueue(r"c:\temp")

while True:
    # doing something
    frame = np.random.rand(3,2)
    # implement fixed size queue
    if len(images_data) >= 10:
        images_data.pop()
    images_data.push(frame.tobytes())  # add the new frame to the main database

# after the while loop ends

images_data.close()  # close the handle to the queue

在长时间运行时,我观察到:
1.队列文件q00000始终为0 KB
1.设备的磁盘内存正在减少,直到它达到PC内存的极限。我认为队列正在不断变大,尽管我在添加新的元素之前“弹出”了任何旧的元素...
我使用的是Windows和Python 3.8

有人能帮我弄清楚为什么队列的大小不断变大,或者告诉我实现固定大小队列的正确方法吗?

谢谢你们!

cpjpxq1n

cpjpxq1n1#

因此,在浏览了queuelib的源代码之后,看起来queuelib在您向持久性磁盘存储添加记录和从持久性磁盘存储删除记录时实际执行的操作是跟踪内部偏移量,并在Queue保持打开的同时对其进行添加或减去。
这意味着添加到队列中的每条记录都将写入文件,并保持写入状态,直到队列关闭,此时它将丢弃以前从数据结构中弹出的任何数据。
因此,一个可能的解决方案是关闭队列,然后偶尔重新打开队列。
例如,

from queuelib import FifoDiskQueue
import numpy as np

path = "C:\\temp"
data = FifoDiskQueue(path)

counter = 0
while True:
    frame = np.random.rand(2,3).tobytes()
    data.push(frame)
    if len(data) >= 10:
        data.pop()
    counter += 1
    if counter % 1000 == 0:
        data.close()
        data = FifoDiskQueue(path)

更新

还有一个chunksize参数可以降低,当设置为一个较小的数字时,它的作用与前面的解决方案基本相同。默认值为100,000。将其设置为较低的值是更好的解决方案。chunksize是一个引用,表示在内部关闭文件之前,存储中保存的记录数。因此较低的数字限制了文件在关闭和丢弃弹出数据之前可以获得的最大大小。
例如:

from queuelib import FifoDiskQueue
import numpy as np

path = "C:\\temp"
data = FifoDiskQueue(path, chunksize=1000)
while True:
    frame = np.random.rand(2,3).tobytes()
    data.push(frame)
    if len(data) >= 10:
        data.pop()

相关问题