【发布时间】:2015-11-23 11:27:16
【问题描述】:
我在堆队列中使用了几个生成器来遍历磁盘上的排序文件。通常 heapq 在超出范围之前不会完全耗尽,因此底层生成器永远不会达到 StopIteration 条件。
我希望能够将处理程序附加到生成器或其他一些优雅的机制,以便在生成器超出范围时删除磁盘上的文件。这些文件本身是临时的,因此可以删除它们。但是,如果它们没有被删除,程序最终会用临时文件填满磁盘。下面是生成器供参考:
def _read_score_index_from_disk(file_name, buffer_size=8*10000):
"""Generator to yield a float/int value from a file, does buffering
and file managment to avoid keeping file open while function is not
invoked"""
file_buffer = ''
file_offset = 0
buffer_offset = 1
while True:
if buffer_offset > len(file_buffer):
data_file = open(file_name, 'rb')
data_file.seek(file_offset)
file_buffer = data_file.read(buffer_size)
data_file.close()
file_offset += buffer_size
buffer_offset = 0
packed_score = file_buffer[buffer_offset:buffer_offset+8]
buffer_offset += 8
if not packed_score:
break
yield struct.unpack('fi', packed_score)
我知道atexit 处理程序,但在我的情况下它不起作用,因为此代码将用于长时间运行的进程。
【问题讨论】:
标签: python generator file-management