在Python中读写数据的最快方法是什么?

4
假设我有一个非常大的文件,我想将其简单地分成较小的块并逐个处理。然而,在该实现中,读取和写入这些块是瓶颈。因此,我正在寻找最好的可能方式。我目前正在使用cPickle,转储和加载这些块。你有其他替代建议吗?

1
考虑将文件加载到更快的存储器中(如Ignacio建议的mmap),或者高速缓存(如memcache或redis)。这样可以加快拆分和分块的过程。如果要将数据写入磁盘,就无法避免IO操作。 - Burhan Khalid
你的文件有多大(以GB或TB为单位),是什么文件格式? - usethedeathstar
@usethedeathstar 文件格式不是问题,如果一个格式比另一个更快,我可以转换它。问题是找到最佳的读取方法和方便的文件格式。 - erogol
你能将数据转换为简单的C结构吗?你可以使用CFFI结构将内存转储到文件中,甚至可以使用mmap。在PyPy上,CFFI速度快得多。无论如何,硬盘都非常缓慢,你甚至有时间压缩/解压缩数据(例如LZO压缩)。 - Arpegius
@Erogol 是的,所以了解你现在使用哪种文件格式以及当前文件格式的大小是很有趣的。 - usethedeathstar
我继续编写了自己的二进制文件格式来解决这个问题。(回复晚了,抱歉) - erogol
2个回答

2

mmap函数将文件缓存的一部分映射到进程内存中,从而允许基于指针(或在Python中,基于索引/切片)对文件中的字节进行访问。然后,您可以切片mmap对象以获取字符串,并将它们传递给cPickle.loads()函数以恢复原始对象。


1
您可能无法比file.read(chunksize)更快地从文件中读取chunksize字节。 您可以一直这样做,直到读取的字节数小于chunksize(然后您就知道已经到达了文件结尾)。 例如:
with open('datafile') as fin:
    data = fin.read(chunksize)
    process(data)
    while len(data) == chunksize
        data = fin.read(chunksize)
        process(data)

然而,既然你说你正在使用cPickle——我不太确定数据长什么样,或者你是否在寻找更复杂的东西...
还有一个警告——一般来说,文件IO是您可以在计算机上执行的最慢的操作之一。如果您要频繁地执行此操作,无论您做什么,都可能会成为瓶颈(除非您拥有一个非常高级的文件系统——那么您可能可以采取一些措施)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接