有没有办法直接将二进制文件读入RAM?
我的意思是,有没有办法告诉编译器,这里是文件,这里是RAM块,请把文件内容放在RAM中,关闭你,快你好。
目前我正逐步使用ifstream将其加载到64位块的RAM(数组)64位块中。但是我认为这必须放慢速度,因为它就像(这里是类比)使用顶针将水从杯子(文件)中舀出来放入水壶(RAM)而不是仅仅拿起杯子和将所有内容一次性倒入壶中。
作为一个相对较新的人,我可能对此有完全错误的想法 - 任何指导都将是一个很大的帮助。
我只是采用最快的方式将大文件放入RAM。
由于
答案 0 :(得分:11)
是什么阻止您一次性阅读文件?是否太大而无法记忆?
您还可以使用映射文件,UNIX:mmap,Windows:CreateFileMapping
答案 1 :(得分:6)
我认为你需要的是memory mapped file,但是API取决于你所使用的操作系统,在UNIX中我认为它是mmap()。
答案 2 :(得分:2)
mmap
应该适合你。大多数实现在引用实际内存页面之前实际上并不读取文件,但无论如何,您可以像访问RAM一样访问文件内容。
答案 3 :(得分:2)
您没有说明您所使用的平台,但这听起来像是内存映射文件的作业。
答案 4 :(得分:0)
你的程序被赋予虚拟内存 - 其中一些映射到RAM,一些映射到交换文件,你无法做很多事情。但是,您可以通过复制更大的块来减少使用文件系统接口的开销 - 例如,几兆字节。
答案 5 :(得分:0)
我不确定这是不是你问的问题,但是为了加快从文件读取的速度,你可以缓冲更多的字节。可以设置fstream的read()方法的第二个参数来指定输入大小。例如,给他一个32k(32 *(2 ^ 10))值可以加快阅读过程。我建议你用不同的缓冲区大小做一些基准测试。
如果你的意思是“避免将文件置于交换状态并将其始终放在RAM中”我认为你可以,因为这是操作系统需要注意的事情。
答案 6 :(得分:0)
查看DirectX SDK中的ContentStreaming示例。
它使用文件映射方法。显然,它使用的是Windows API,但您也可以为其他平台找到相应的API。
有趣的是,它向您展示了上下文中的方法。 (按需读取/分页大型模型的部分(在本例中为地形)
答案 7 :(得分:0)
Boost为内存映射文件提供跨平台支持,其中包括......