使用哪种类型的文件访问?

时间:2014-03-11 02:45:05

标签: c++ windows io

我正在构建一个仅适用于Windows的自定义文件格式的io框架。这些文件在100MB到100GB之间。在不可预测的位置,读/写的行数为几百KB到几MB。读取速度是最关键的,但是,cpu使用可能胜过,因为我听说fstream在使用SSD时可能会对它产生影响。

最初我打算使用fstream,但随着我对文件IO的更多关注,我发现了许多其他选项。由于我对这个主题没什么经验,所以我很难理解使用哪种方法。我选择的选项是fstream,FILE和映射文件。

在我的研究中,到目前为止,我所发现的是很多矛盾的基准测试结果,这取决于块大小,缓冲区大小和其他我不理解的瓶颈。如果有人能够澄清这些选项之间的优点/缺点,将会很有帮助。

1 个答案:

答案 0 :(得分:0)

在这种情况下,瓶颈主要是您的硬件而不是您使用的库,因为您正在阅读的块相对较大200KB - 5MB(与扇区大小相比)和顺序(一体化)。 对于硬盘(高寻道时间),它可以读取比优化缓存所需的更多数据。对于SSD,我不会使用大缓冲区,而是只读取确切的所需数据,因为寻道时间不是一个大问题。

内存映射文件可以方便地完全随机访问您的数据,尤其是在小块(甚至几个字节)中。但是设置内存映射文件需要更多代码。在64位系统上,您可以(虚拟地)映射整个文件,然后让操作系统缓存系统优化读取(对同一数据的多次访问)。然后,您可以只返回指向所需内存位置的指针,甚至无需使用临时缓冲区或使用memcpy。这很简单。

与FILE相比,fstream为您提供了额外的功能,我认为这些功能在您的情况下并不常用。