【发布时间】:2011-07-27 07:11:34
【问题描述】:
给你上下文:
我有一个大文件f,有几个 Gigs 大小。它包含通过运行生成的不同对象的连续泡菜
for obj in objs: cPickle.dump(obj, f)
我想在读取这个文件时利用缓冲。我想要的是一次将 几个 拾取的对象读入缓冲区。这样做的最佳方法是什么?我想要一个类似于readlines(buffsize) 的腌制数据。事实上,如果选择的数据确实是换行符分隔的,可以使用 readlines,但我不确定这是否属实。
我想到的另一个选项是先将dumps() 腌制对象写入字符串,然后将字符串写入文件,每个字符串由换行符分隔。要读回文件,我可以使用readlines() 和loads()。但我担心腌制的对象可能有"\n" 字符,它会抛出这个文件读取方案。我的恐惧是没有根据的吗?
一种选择是将其腌制为一个庞大的对象列表,但这需要的内存超出了我的承受能力。设置可以通过多线程加速,但我不想在缓冲正常工作之前去那里。这种情况的“最佳做法”是什么。
编辑: 我还可以将原始字节读入缓冲区并在其上调用加载,但我需要知道加载消耗了该缓冲区的多少字节,以便我可以扔掉头。
【问题讨论】:
-
应该已经在后台进行缓冲了。线程也无济于事。
-
如果您可以控制 pickle 文件的创建,您可以使用
pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)(或等效的pickle.dump(obj, f, -1))使其更小,这是一个二进制协议,并且更紧凑比你得到的默认 ASCII 码。拥有一个小得多的文件可能会减轻对缓冲的担忧。事实上,这可能意味着@Kirk Strauser 的answer 中的“寻找以'.\n'结尾的行”的技巧不起作用。
标签: python newline pickle buffering