是否可以使用mmap文件迭代列表? 关键是列表太大(超过3 000 000项)。当我启动程序时,我需要快速访问此列表,因此在启动程序后我无法将其加载到内存中,因为它需要几秒钟。
with open('list','rb') as f:
mmapList = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) # As far as I'm concerned, now I have the list mapped in a virtual memory.
现在,我想迭代这个列表。
for a in mmapList
不起作用。
编辑:我知道的唯一方法是将列表项保存为txt文件中的行,然后使用readline,但我很好奇是否有更好更快的方法。
答案 0 :(得分:0)
您不需要使用mmap来迭代cPickled列表。你需要做的就是不是挑选整个列表,腌制和转储每个元素,然后从文件中逐个读取它们(可以使用生成器)。
代码:
import pickle
def unpickle_iter(f):
while True:
try:
obj = pickle.load(f)
except EOFError:
break
yield obj
def save_list(list, path):
with open(path, 'w') as f:
for i in list:
pickle.dump(i, f)
def load_list(path):
with open(path, 'r') as f:
# here is your nice "for a in mmaplist" equivalent:
for obj in unpickle_iter(f):
print 'Loaded object:', obj
save_list([1,2,'hello world!', dict()], 'test-pickle.dat')
load_list('test-pickle.dat')
输出:
Loaded object: 1
Loaded object: 2
Loaded object: hello world!
Loaded object: {}