2009-07-06 61 views
1

有没有办法直接读取二进制文件到RAM中?在C++中直接从文件读取数据到RAM

我的意思是说,有没有办法告诉编译器,这里是文件,这里是RAM块,请把文件内容放到RAM中,快速地按照你的要求。

目前我正在逐步通过ifstream将其加载到64位块(64位块)的RAM(数组)中。但我认为这必须减缓它的速度,因为它使用顶针将杯子(文件)中的水舀到一个罐子(RAM)中,而不是仅仅拿起杯子,一次性将全部内容物倒入水罐中。

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

我只是以最快的方式获取大文件到RAM中。

感谢

+0

很好的问题,并为+1比喻:) – 2012-05-04 11:41:42

回答

11

是什么阻止您一次读取文件?内存太大了吗?

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

+0

谢谢,我被过于复杂的答案帮助了我。 – Columbo 2009-07-08 12:35:29

2

mmap应该为你工作。除非您参考实际的内存页面,否则大多数实现不会实际读取该文件,但无论如何,您可以像访问内存一样访问文件内容。

2

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

6

我想你需要的是memory mapped file,但是API取决于你在哪个操作系统,在UNIX我相信这是mmap()的。

0

你的程序被赋予了虚拟内存 - 其中一些映射到RAM上,一些映射到交换文件上,你不能做太多的事情。但是,您可以通过复制更大的块来减少使用文件系统接口的开销 - 例如几兆字节。

0

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

如果您的意思是“避免将文件放在交换位置并将其放在内存中”,我认为您可以,因为这是操作系统所关心的。

+0

我在这段时间做了一些基准测试,发现增加的缓冲区大小并不会像您预期的那样提高速度 - 在20%到40%之间,这是值得的,但并不惊人。使用内存映射几乎肯定会增加更多。 – 2009-07-06 10:03:19

0

查看DirectX SDK中的ContentStreaming示例。

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

有趣的是,它向您展示了上下文中的方法。 (根据需要在一个巨大的模型(在这种情况下,地形)的部分阅读/分页