使用mmap迭代列表 - Python

时间:2014-11-12 18:47:20

标签: python mapping mmap

是否可以使用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,但我很好奇是否有更好更快的方法。

1 个答案:

答案 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: {}