File 需要快速文件访问选项

File 需要快速文件访问选项,file,filesystems,performance,File,Filesystems,Performance,我希望我的代码能够非常快地处理文件。此文件大小从单个KB到2 GB不等 甚至我也准备为这个文件创建一个单独的文件系统 我将把文件分割为固定大小的块(可能是8KB),并访问它进行数据读写。在代码方面,该算法不能更改,因为它提供了良好的性能和稳定的性能。所以我不想改变。我还使用mmap()按需将块映射到内存 是否可以将文件系统作为单个块来获取,以便文件访问、读写操作可以更快 请给出你所有的建议,哪怕是一件对我有帮助的小事 这些建议可以跨平台和文件系统 谢谢, Naga或允许您直接访问内存中的文件。操

我希望我的代码能够非常快地处理文件。此文件大小从单个KB到2 GB不等

甚至我也准备为这个文件创建一个单独的文件系统

我将把文件分割为固定大小的块(可能是8KB),并访问它进行数据读写。在代码方面,该算法不能更改,因为它提供了良好的性能和稳定的性能。所以我不想改变。我还使用mmap()按需将块映射到内存

是否可以将文件系统作为单个块来获取,以便文件访问、读写操作可以更快

请给出你所有的建议,哪怕是一件对我有帮助的小事

这些建议可以跨平台和文件系统

谢谢, Naga

或允许您直接访问内存中的文件。操作系统会根据需要透明地在页面中出错,甚至可能提前阅读(可以用或提示)。根据您的访问模式和文件的大小,这可能比正常读取/写入文件快得多


不利的一面是,您将不得不更多地担心一致性(请确保使用或小心),而且由于需要对页表进行操作,因此速度也可能较慢。

Windows允许您打开分区进行原始读取和写入。它还允许您为原始IO打开物理设备。因此,如果您愿意将硬盘或分区视为单个文件,则可以保证“文件”在磁盘上逻辑上是连续的。(由于硬盘对坏扇区进行热修复的方式,它实际上可能并不连续)

如果选择执行原始io,则必须以设备块大小的倍数进行读写。这通常是512字节,但可能更明智的做法是使用4k作为块大小,因为较新的磁盘正在使用4k,这是Win32的页面大小

要打开分区进行原始读取,请使用文件名“\。\X:”其中X:是分区的驱动器号。请参阅标题为“物理磁盘和卷”一节下的CreateFile文档

另一方面,很难打败内存映射文件的性能,请参见此问题的示例

始终尝试以64kB-1MB的块顺序访问文件。这样,您就可以利用预取并最大限度地增加每个I/O操作的数据量


另外,首先要确保文件是连续的,这样磁盘头就不必在连续读取之间移动太多。如果您通过设置文件结尾或一次对整个文件执行
write()
,许多文件系统将创建尽可能连续的文件。在Windows上,您可以使用sysinternals.com实用程序
contig.exe
使文件连续。

常规,独立于操作系统的常规规则:

  • 使用物理读取(而不是 (溪流)

  • 使用大型I/O缓冲区进行读取。I/O操作的初始化(以及与旋转硬件的同步)耗费时间。几次小的阅读比一次大的阅读需要更长的时间

  • 创建一些基准来计算出最有效的缓冲区大小。给定大小后,效率将不会提高,并且您不想不必要地吞下所有宝贵的RAM。最佳缓冲区大小取决于您的硬件和操作系统。在当前硬件上,使用500KB到1MB范围内的缓冲区大小通常足够有效

  • 最小化磁盘头搜索。也就是说,如果必须将数据写回,读/写交替可能会非常昂贵,如果它们是在同一个物理磁盘上

  • 如果您有一些重要的处理要做,请使用双缓冲和异步IO来重叠IO和处理


您打算使用什么操作系统?什么语言?我的代码应该可以跨操作系统工作。为了简单起见,首先我想在Linux(Fedora 11)中实现您的建议,我使用的是C语言。我知道mmap()将是更好的选择,我正在使用它。现在我将文件划分为8k块。块大小有什么硬性规定吗?示例:如果我访问一个特定的块,它将以单页错误的方式加载。现在大多数常见平台上的块大小为4kB或8kB,尽管Linux允许您
mmap(…MAP_HUGETLB…)
这可能会给您2MB或4MB的页面;这样,页面错误会减少,但每个错误都需要更长的时间才能满足。不要认为操作系统只是按需映射页面,然后将它们留在周围:它可能会提前阅读并抢先映射更多页面,或者可能会删除它需要/想要逐出的页面。在自己的系统上进行实验,结果会因许多因素而有所不同。我知道mmap()将是更好的选择,我正在使用它。现在我将文件划分为8k块。块大小有什么硬性规定吗?示例:如果我访问一个特定的块,它将以单页错误加载。