【发布时间】:2014-11-12 18:47:20
【问题描述】:
是否可以使用 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 但我很好奇是否有更好更快的方法。
【问题讨论】:
-
列表是如何保存到该文件中的?
-
@pbkhrv 它是使用 cPickle 保存的,但我可以更改它。
-
mmap 对象充当一个字符串 (docs.python.org/2/library/mmap.html),因此如果不先将整个内容加载到内存中,使用 cPickle 反序列化您的列表并不是一个真正的选择。但是,可以编写一个简单的生成器,这样“for a in mmapList”仍然可以通过使用 readline() 逐步遍历 mmap 来工作。这能解决你的问题吗?
-
实际上,有一种方法可以做到这一点,并且仍然使用泡菜。看我的回答。