【问题标题】:Which type of file access to use?使用哪种类型的文件访问?
【发布时间】:2014-03-11 02:45:04
【问题描述】:

我正在为 Windows 的自定义文件格式构建一个 io 框架。文件大小在 100MB 到 100GB 之间。读取/写入在不可预测的位置以几百 KB 到几 MB 的顺序出现。读取速度是最关键的,不过,cpu 的使用可能会胜过这一点,因为我听说 fstream 在使用 SSD 时可以真正削弱它。

最初我打算使用 fstream,但是当我对文件 IO 进行了更多操作时,我发现了许多其他选项。由于我对该主题的经验很少,因此我对使用哪种方法感到很困惑。我列出的选项是 fstream、FILE 和映射文件。

到目前为止,在我的研究中,我发现的只是很多相互矛盾的基准测试结果,具体取决于我不了解的块大小、缓冲区大小和其他瓶颈。如果有人能阐明这些选项之间的优缺点,那将很有帮助。

【问题讨论】:

  • 您确定不应该使用数据库吗? (例如,在您的文件中包装 SQLLite)
  • 文件格式将包含各种数据库,但其相互关联的方式,我需要对文件进行更多的控制以使其更流畅。

标签: c++ windows io


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-11
    • 2017-05-18
    • 2013-02-13
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2015-11-14
    • 2016-05-22
    相关资源
    最近更新 更多