【问题标题】:Read data directly from file to RAM in C++在 C++ 中直接从文件读取数据到 RAM
【发布时间】:2010-11-08 08:18:23
【问题描述】:

有没有办法直接将二进制文件读入RAM?

我的意思是,有没有办法告诉编译器,这是文件,这是 RAM 块,请把文件内容放在 RAM 中,走吧,快点。

目前,我正在使用 ifstream 将文件逐个 64 位块加载到 RAM(数组)64 位块中。但我认为这必须减慢它的速度,就像(这里有一个类比)使用顶针将水从杯子(文件)中舀到水罐(RAM)中,而不是仅仅拿起杯子然后一口气把所有的东西都倒进罐子里。

作为一个相对较新的人,我可能对此有完全错误的想法 - 任何指导都会有很大的帮助。

我正在寻找将大文件放入 RAM 的最快方法。

谢谢

【问题讨论】:

  • 很好的问题,类比+1 :)

标签: c++ file ram ram-scraping


【解决方案1】:

Boost 为内存映射文件提供跨平台支持...

Boost Memory Mapped files

【讨论】:

    【解决方案2】:

    查看 DirectX SDK 中的 ContentStreaming 示例。

    它使用文件映射方法。很明显,它使用的是windows API,但你也可以找到其他平台对应的API。

    有趣的是,它在上下文中向您展示了方法。 (按需读取/分页大型模型(在本例中为地形)的部分内容

    【讨论】:

      【解决方案3】:

      我不确定这是否是您所要求的,但为了加快从文件中读取的速度,您可以缓冲更多字节。 fstream 的 read() 方法的第二个参数可以设置为指定输入大小。例如,给他一个 32k (32*(2^10)) 的值可以加快阅读过程。我建议你用不同的缓冲区大小做一些基准测试。

      如果您的意思是“避免将文件放在交换位置并始终将其放在 RAM 中”,我认为您可以,因为这是操作系统会处理的事情。

      【讨论】:

      • 我不久前对此进行了一些基准测试,发现增加的缓冲区大小并没有像您预期的那样使您的速度提高 20% 到 40%,这是值得的,但并不惊人。使用内存映射几乎肯定会带来更大的增长。
      【解决方案4】:

      您的程序被赋予了虚拟内存——其中一些映射到 RAM,一些映射到交换文件,您对此无能为力。但是,您可以通过复制更大的块(例如几兆字节)来减少使用文件系统接口的开销。

      【讨论】:

        【解决方案5】:

        我认为您需要的是 memory mapped file,但是 API 取决于您使用的操作系统,在 UNIX 中我相信它是 mmap()。

        【讨论】:

          【解决方案6】:

          是什么阻止您一次性读取文件?是否太大而无法放入内存?

          您也可以使用映射文件,UNIX:mmap,Windows:CreateFileMapping

          【讨论】:

          • 谢谢,我的回答过于复杂了。
          【解决方案7】:

          你没有说你在哪个平台上,但这听起来像是内存映射文件的工作。

          【讨论】:

            【解决方案8】:

            mmap 应该适合你。大多数实现在您引用实际内存页面之前不会真正读取文件,但无论如何您都可以访问文件内容,就像它一直在 RAM 中一样。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-12-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-06
              相关资源
              最近更新 更多