我希望我的代码能够非常快速地处理文件。此文件大小将从单KB到甚至2 GB不等。
即使我已准备好为该单个文件创建单独的文件系统。
我将文件拆分为常量大小的块(可能是8KB)并访问它以进行数据读写。代码方面,算法不能改变,因为它提供了良好的性能和稳定的性能。所以我不想改变。我也在使用mmap()按需将块映射到内存。
是否可以将文件系统作为单个块,以便文件访问,读写操作可以更快?
请提供所有建议,即使是一件对我有帮助的小事。
建议可以跨平台和文件系统。
谢谢, 纳加
答案 0 :(得分:1)
一般,操作系统独立的一般规则:
使用物理读取(而不是 流)
使用大I / O缓冲区进行读取。 I / O操作的初始化(以及与旋转硬件的同步)是耗时的。几个小读取的时间比一个大读取的时间长。
创建一些基准来确定最有效的缓冲区大小。在给定大小后,效率不会提高,并且您不希望不必要地吞噬所有宝贵的RAM。最佳缓冲区大小取决于您的硬件和操作系统。在当前硬件上,使用500KB到1MB范围内的缓冲区大小通常足够高效。
最小化磁盘头搜索。即如果你必须重新写入数据,那么如果它们是相同的物理磁盘,那么读/写交替可能会非常昂贵。
如果您要进行一些重要的处理,请使用双缓冲和异步IO来重叠IO和处理。
答案 1 :(得分:0)
mmap
或MapViewOfFile
可让您直接在内存中访问文件。操作系统将根据需要透明地在页面中出错,或者甚至可以提前读取(可以使用madvise
或FILE_FLAG_*
暗示)。根据您的访问模式和文件大小,这可能明显快于正常读取/写入文件。
在缺点方面,您将不得不担心一致性(确保谨慎使用msync
或FlushViewOfFile
),并且由于必要的页面表操作,它可能会更慢
答案 2 :(得分:0)
Windows允许您打开原始读取和写入的分区。它还可以让您为原始IO打开物理设备。因此,如果您愿意将硬盘或分区视为单个文件,则可以保证磁盘上的“文件”在逻辑上是连续的。 (由于硬盘为坏扇区执行修补程序的方式,实际上它可能不是物理连续的)。
如果您选择执行原始io,则必须以设备的块大小的倍数读取和写入。这通常是512字节,但使用4k作为块大小可能更明智,因为这是更新的磁盘使用的,这是Win32的页面大小。
要为原始读取打开分区,请使用文件名为“\。\ X:”的CreateFile,其中X:是分区的驱动器号。请参阅标题物理磁盘和卷
部分下的CreateFile文档另一方面,要击败内存映射文件的性能非常困难,请参阅此问题的示例 How to scan through really huge files on disk?
答案 3 :(得分:0)
始终尝试以64kB-1MB的块顺序访问您的文件。这样,您就可以利用预取并最大化每个I / O操作的数据量。
此外,尝试确保文件首先是连续的,这样磁盘头不必在顺序读取之间移动很多。如果您通过设置文件结尾或一次执行整个文件的write()
开始,许多文件系统将创建一个尽可能连续的文件。在Windows上,您可以使用sysinternals.com实用程序contig.exe
使文件连续。