readlines()返回文件全部内容的列表。你一次要读几行。我认为这段天真的代码应该能解开你的数据:import pickle
infile = open('/tmp/pickle', 'rb')
buf = []
while True:
line = infile.readline()
if not line:
break
buf.append(line)
if line.endswith('.\n'):
print 'Decoding', buf
print pickle.loads(''.join(buf))
buf = []
如果您可以控制生成pickle的程序,我将选择以下选项之一:使用shelve模块。
在将每个pickle写入文件之前打印它的长度(以字节为单位),以便准确地知道每次要读取多少字节。
同上,但将整数列表写入一个单独的文件,以便可以将这些值用作保存pickle的文件的索引。
一次选取K个对象的列表。以字节为单位写入pickle的长度。写泡菜。重复。
顺便说一下,我怀疑file的内置缓冲应该能让您获得所需性能的99%。
如果您确信I/O阻塞了您,您是否考虑过尝试mmap()并让操作系统一次处理块打包?#!/usr/bin/env python
import mmap
import cPickle
fname = '/tmp/pickle'
infile = open(fname, 'rb')
m = mmap.mmap(infile.fileno(), 0, access=mmap.ACCESS_READ)
start = 0
while True:
end = m.find('.\n', start + 1) + 2
if end == 1:
break
print cPickle.loads(m[start:end])
start = end