我尝试使用我想在项目中使用的数据创建一个大型内存映射文件。我使用Boost库来映射文件,一切似乎运行正常,直到我尝试创建一个大文件(> 2GB)。我的电脑只有3GB的RAM,在创建文件时它会冻结。有没有办法使用小块数据创建文件,避免冻结过程?
char p[20] = "test.raw";
boost::iostreams::mapped_file_params params;
params.path = "test.raw";
params.new_file_size = sizeof(struct Rectangle) * data_size;
params.mode = std::ios_base::out;
boost::iostreams::mapped_file file;
file.open(params);
struct Rectangle* dataMAP = (struct Rectangle*) file.data();
for(unsigned long long i=0; i<data_size; i++){
dataMAP[i] = struct Rectangle(rand_float_array);
}
我在64位模式下运行程序并启用了/ LARGEADRESSAWARE。
更新
我目前正尝试使用&#34; Boost Interprocess&#34;运行一个小例子。图书馆,但我不能让它运行。这是我的代码基于this回答:
std::string vecFile = "vector.dat";
bi::managed_mapped_file file_vec(bi::open_or_create,vecFile.c_str(), sizeof(struct Rectangle) * data_size);
typedef bi::allocator<struct Rectangle, bi::managed_mapped_file::segment_manager> rect_alloc;
typedef std::vector<struct Rectangle, rect_alloc> MyVec;
MyVec * vecptr = file_vec.find_or_construct<MyVec>("myvector")(file_vec.get_segment_manager());
vecptr->push_back(random_rectangle);
但是编译器说它无法推断出&#39; _Ty *&#39;的模板参数。来自&#39; boost :: interprocess :: offset_ptr&#39;。我做错了什么?
答案 0 :(得分:1)
boost :: iostreams在幕后调用Win32 CreateFileMapping函数here ...此函数为您提供文件视图。请注意,提升的零值作为dwMaximumSizeHigh
和dwMaximumSizeLow
参数传递 - 它要求将视图映射到整个大文件中。
看起来,列出的{F(1)}的CreateFileMapping()有很多限制。请注意&#34;文件视图的大小限制为最大可用的连续虚拟内存块。&#34; ...所以我认为iostreams实际上要求你的系统分配一大块虚拟内存,这显然会让你的系统陷入死亡螺旋。
由于您已经在使用Boost,我会给它的here库一个镜头。它具有良好的内存映射文件支持,可以映射到MMF的类似STL的容器,并且它支持映射该巨大文件的较小区域。