如果您的“数字”是足够简单的数字(每个最大为4个字节的有符号或无符号整数,或者每个为4或8个字节的浮点数),我建议使用标准库数组模块作为保留数百万个的最佳方法在内存(“虚拟阵列”的“尖端”)中存储一个二进制文件(针对二进制R / W打开),以支持磁盘上其余结构。array.array
具有非常快fromfile
和tofile
方式,方便数据的来回移动。
即,基本上,假设无符号长数,例如:
import os
# no more than 100 million items in memory at a time
MAXINMEM = int(1e8)
class bigarray(object):
def __init__(self):
self.f = open('afile.dat', 'w+')
self.a = array.array('L')
def append(self, n):
self.a.append(n)
if len(self.a) > MAXINMEM:
self.a.tofile(self.f)
del self.a[:]
def pop(self):
if not len(self.a):
try: self.f.seek(-self.a.itemsize * MAXINMEM, os.SEEK_END)
except IOError: return self.a.pop() # ensure normal IndexError &c
try: self.a.fromfile(self.f, MAXINMEM)
except EOFError: pass
self.f.seek(-self.a.itemsize * MAXINMEM, os.SEEK_END)
self.f.truncate()
return self.a.pop()
当然你也可以添加其他的方法在必要时(总长度如跟踪,添加extend
,等等),但如果pop
和append
确实是你所需要的这应有助于。