2

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

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

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

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

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

谢谢

4

8 回答 8

11

是什么阻止您一次性读取文件?是不是太大而无法存储在内存中?

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

于 2009-07-06T09:50:33.043 回答
6

我认为您需要的是内存映射文件,但是 API 取决于您使用的操作系统,在 UNIX 中我相信它是 mmap()。

于 2009-07-06T09:50:39.017 回答
2

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

于 2009-07-06T09:50:20.487 回答
2

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

于 2009-07-06T09:50:31.687 回答
0

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

于 2009-07-06T09:51:15.163 回答
0

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

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

于 2009-07-06T10:00:10.090 回答
0

查看 DirectX SDK 中的 ContentStreaming 示例。

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

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

于 2009-07-06T10:55:03.273 回答
0

Boost 为内存映射文件提供跨平台支持,除此之外......

提升内存映射文件

于 2010-01-02T12:01:15.687 回答