繁体   English   中英

C ++:创建大内存映射文件会冻结PC

[英]C++: Creating large memory mapped file freezes pc

我正在尝试使用要在项目中使用的数据创建一个大内存映射文件。 我正在将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。

UPDATE

我目前正在尝试使用“ Boost Interprocess”库运行一个小示例,但是我无法使其运行。 这是我基于答案的代码:

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);

但是编译器说它不能从'boost :: interprocess :: offset_ptr'推导出'_Ty *'的模板参数。 我究竟做错了什么?

boost :: iostreams在这里在后台调用Win32 CreateFileMapping函数...此函数使您可以查看文件。 并注意boost作为dwMaximumSizeHighdwMaximumSizeLow参数传递的零值-它要求在整个大文件中映射视图。

在这里列出的CreateFileMapping()似乎有很多限制。 请注意“文件视图的大小限于未保留的虚拟内存的最大可用连续块”部分。 ...所以我认为iostreams实际上是在要求您的系统分配大量的虚拟内存,这显然使您的系统陷入死循环。

既然您已经在使用Boost,那么我可以尝试一下它的进程间库。 它具有良好的内存映射文件支持,可以映射到MMF的类似于STL的容器,并且它支持映射该大文件的较小区域。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM