boost::memory-mapping 的问题 ~500MB,外部 USB 文件
Posted
技术标签:
【中文标题】boost::memory-mapping 的问题 ~500MB,外部 USB 文件【英文标题】:Issue with boost::memory-mapping ~500MB, external USB file 【发布时间】:2013-08-31 22:35:57 【问题描述】:我正在使用以下代码打开大小约为 400 到 800MB 的文件:
#include <boost\interprocess\file_mapping.hpp>
#include <boost\interprocess\mapped_region.hpp>
#include <iostream>
#include <vector>
#include <string>
using namespace boost::interprocess;
using namespace std;
int main()
file_mapping fm("C:\\test\\1.txt",read_only);
mapped_region region(fm,read_only);
const char* const data = static_cast<const char*>(region.get_address());
const size_t max_size = region.get_size();
cout << max_size;
int b;
cin >> b;
如果我将上面的代码指向一个小文件,我也不会例外。但是,当查看数百 MB 的文件(在外部 USB 上)时,我得到了一个例外:
ReadingFiles.exe 中 0x7521C41F 处未处理的异常:Microsoft C++ 异常:内存中的 boost::interprocess::interprocess_exception 位置 0x0040FBD4.
我有 2.4GB 的可用 RAM - 所以不应该是我的内存用完了吗?
【问题讨论】:
32位程序? 32 位窗口? 我认为这是解决方案(32 位程序)。把它作为答案,我会接受。谢谢 请注意,32 位 windows 程序只能使用 2Gb 的内存地址空间。 (并且在该地址空间中,已经映射了 .dll、代码、堆等片段,进一步减少了 32 位进程可以从中分配空间的可用内存 一条与您的问题无关的建议:使用正斜杠,如#include <boost/interprocess/file_mapping.hpp>
;这样它在 Unix 和 Windows 中都可以工作。
【参考方案1】:
如果您的程序被编译为 32 位程序,您很可能内存不足。有点。 2.4GB 空闲并不一定意味着 2.4GB 空闲连续内存。您可能无法获得足够大的数据块来映射您的文件。
【讨论】:
以上是关于boost::memory-mapping 的问题 ~500MB,外部 USB 文件的主要内容,如果未能解决你的问题,请参考以下文章