gpt4 book ai didi

c++ - 来自映射文件的 IO 与使用文件流的 IO

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:29 25 4
gpt4 key购买 nike

我正在开发一个需要处理大量数据(以 GB 为单位)的应用程序。我不需要在任何时刻一次获得所有数据。可以对数据进行分段,并且只在任何给定实例的一个部分上工作(并因此将其放入内存中)。

我读到大多数需要操作大量数据的应用程序通常通过使用内存映射文件来实现。进一步阅读内存映射文件,我发现从内存映射文件读取/写入数据比普通文件 IO 更快,因为我们最终使用高度优化的页面文件算法来执行读写。

以下是我的查询:

  1. 使用内存映射文件(我计划使用 boost::file_mapping 并且我在 Windows 上工作)进行文件 IO 与使用文件流有何不同?
  2. 与使用文件流(在传统硬盘 7200 rpm 上)相比,内存映射文件的数据读/写速度有多快?
  3. 内存映射文件是处理如此庞大数据量的唯一方法吗?有没有更好的方法(考虑我的用例)?

最佳答案

(免责声明:我是 proposed Boost.AFIO 的作者)

How different is using memory mapped files(I am planning to use boost::file_mapping and I am working on windows) for file IO than using file streams?

大大简化的答案:

内存映射文件会延迟读取 4Kb block ,即当您第一次访问该 4Kb 页面时。当您请求数据时,文件流会进行读取。

更准确的答案:

内存映射文件使您可以直接访问内核页面缓存以进行文件 i/o。您可以确切地看到内核为某个打开的文件保留了哪些内容。读取和写入直接写入内核页面缓存 - 对于缓冲 I/O,速度再快不过了。

How much faster can I expect the data read/writes to be in case of memory mapped files when compared to using file streams(on a traditional hard disk 7200 rpm)?

可能不明显。如果您对差异进行基准测试,则可能是混杂因素,例如不同的缓存算法。硬盘驱动器太慢了,它始终是主导因素。

现在,如果您真的想问从系统负载的角度比较两者的效率,那么内存映射文件的效率可能要高得多。 STL iostreams 至少复制内存一次,加上在 Windows 上,大多数“立即”i/o 实际上是 Windows 内核为您的进程配置的小型内部内存映射的 memcpy,所以这是您读取的所有内容的至少两个内存拷贝。

最有效的始终是 O_DIRECT/FILE_FLAG_NO_BUFFERING 以及随之而来的所有陷阱,但是您很少会编写比操作系统更好的缓存算法。毕竟,他们已经花了数十年时间来调整他们的算法。

Is memory mapped files the only way to deal with such huge amounts of data? Are there better ways of doing this(considering my use case)?

内存映射文件让内核使用通用缓存算法为您缓存一个非常大的数据集,该算法利用您系统中的所有空闲内存。一般来说,对于大多数用例,您不会用自己的算法打败他们。

关于c++ - 来自映射文件的 IO 与使用文件流的 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com