在Python中有效地将千兆字节的数据写入磁盘

时间:2014-03-30 20:18:50

标签: python performance

在Windows和Linux上的Python v2.7中,将5GB数据顺序写入本地磁盘(固定或可移动)的最有效,最快捷的方法是什么?此数据不会很快被读取,也不需要缓存。

正常的编写方式似乎使用操作系统磁盘缓存(因为系统假定它可能很快重新读取这些数据)。这清除了缓存的有用数据,使系统变慢。

现在我正在使用f.write(),一次使用65535个字节的数据。

2 个答案:

答案 0 :(得分:3)

您的操作系统使用磁盘缓存的真正原因并不是它假设数据将被重新读取 - 而是它想要加速写入。您希望尽可能积极地使用操作系统的写缓存。

话虽这么说,以任何语言进行高性能,高容量I / O的“标准”方式(可能是使用操作系统读/写缓存的最积极的方式)是使用内存映射的I / O。 mmap模块(https://docs.python.org/2/library/mmap.html)将提供该模块,并且根据您首先生成数据的方式,您甚至可以通过将其转储到缓冲区来获得更高的性能。

请注意,使用与您一样大的数据集,它只能在64位计算机上运行(32位上的Python mmap仅限于4GiB缓冲区)。

如果您需要更具体的建议,则必须向我们提供有关如何生成数据的更多信息。

答案 1 :(得分:1)

这个答案与Windows代码有关,虽然我认为建议是相似的,但我不知道Linux的等价。

如果您想编写尽可能快的代码,请使用Win32API进行编写,并确保阅读CreateFile的相关部分。具体来说,请确保您不会犯下使用FILE_FLAG_NO_BUFFERING和FILE_FLAG_WRITE_THROUGH标志打开文件的经典错误,有关更多说明,请参阅Raymond Chen的经典博客文章。

如果你坚持以扇区或簇大小的倍数写入,那么不要被魔术数字65535所感谢(为什么这个数字?它不是真正的倍数)。而是使用GetDiskFreeSpace找出适当的扇区大小,尽管这并不是真正的保证(某些数据可能与NTFS文件信息一起保存)。