在Python中高效地将数GB数据写入磁盘
在Windows和Linux的Python v2.7中,如何高效快速地将5GB的数据顺序写入本地磁盘(无论是固定硬盘还是可移动硬盘)?这些数据不会很快被读取,也不需要缓存。
看起来,正常的写入方式会使用操作系统的磁盘缓存(因为系统认为这些数据可能会很快被重新读取)。这会清除缓存中有用的数据,从而让系统变得更慢。
现在我正在使用f.write()一次写入65535字节的数据。
2 个回答
这个回答是针对Windows代码的,我对Linux的情况不太了解,不过我想建议应该差不多。
如果你想写出最快的代码,那就使用Win32API,并确保你阅读一下CreateFile的相关部分。特别要注意,不要犯一个常见的错误,就是在打开文件时使用FILE_FLAG_NO_BUFFERING和FILE_FLAG_WRITE_THROUGH这两个标志。想了解更多,可以看看Raymond Chen的经典博客文章。
如果你坚持要按照某个扇区或簇的大小来写数据,那就不要被65535这个神秘数字束缚(为什么是这个数字?其实并没有什么特别的倍数关系)。相反,可以使用GetDiskFreeSpace来找出合适的扇区大小,不过这也不一定能保证(有些数据可能会和NTFS文件信息一起保存)。
你操作系统使用磁盘缓存的真正原因并不是因为它认为数据会被重新读取,而是为了加快写入的速度。你应该尽可能积极地利用操作系统的写缓存。
说到这里,任何编程语言中进行高性能、高容量输入输出的“标准”方式(也是最有效利用操作系统读写缓存的方法)就是使用内存映射输入输出。mmap模块(https://docs.python.org/2/library/mmap.html)可以提供这种功能,具体来说,取决于你最初是如何生成数据的,你甚至可以通过更早地将数据放入缓冲区来获得更好的性能。
需要注意的是,像你这样的大数据集,只能在64位机器上工作(Python的mmap在32位系统上限制在4GiB的缓冲区)。
如果你想要更具体的建议,你需要告诉我们更多关于你是如何生成数据的信息。