繁体   English   中英

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

[英]Efficiently write gigabytes of data to disk in Python

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

似乎正常的写入方式使用OS磁盘缓存(因为系统假设它可能很快会重新读取此数据)。 这会清除缓存的有用数据,从而使系统变慢。

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

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

话虽这么说,以任何语言进行高性能,大容量I / O的“标准”方法(可能是使用OS的读/写缓存的最积极的方法)是使用内存映射的I / O。 mmap模块( https://docs.python.org/2/library/mmap.html )将提供此功能,并且取决于您首先生成数据的方式,您甚至可以通过转储获得更多性能它更早地发送到缓冲区。

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

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

这个答案与Windows代码有关,尽管我认为建议是相似的,但我对Linux等效代码一无所知。

如果要编写最快的代码,请使用Win32API进行编写,并确保已阅读CreateFile的相关部分。 特别要确保您不要犯使用FILE_FLAG_NO_BUFFERING和FILE_FLAG_WRITE_THROUGH标志来打开文件的经典错误,有关更多说明,请参见Raymond Chen的经典博客文章。

如果您坚持写扇区或簇大小的倍数,那么不要迷惑65535的神奇数字(为什么这个数字呢?不是真正的倍数)。 而是使用GetDiskFreeSpace找出适当的扇区大小,即使这并不是真正的保证(某些数据可能与NTFS文件信息一起保留)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM