2016-01-15 6 views
1

Я пытаюсь создать большой файл с отображением памяти с данными, которые я хочу использовать в проекте. Я использую библиотеку Boost для сопоставленных файлов, и все работает нормально, пока я не попытаюсь создать большой файл (> 2 ГБ). Мой компьютер имеет только 3 ГБ ОЗУ, а во время создания файла он зависает. Есть ли способ создать файл с использованием небольших фрагментов данных и избежать замораживания процесса?C++: Создание большого файла с отображением памяти, зависающего pc

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

В настоящее время я пытаюсь запустить небольшой пример с использованием библиотеки «Повысьте межпроцессный», но я не могу заставить его работать. Это мой код, основанный на 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); 

Но компилятор говорит, что он не может вывести аргумент шаблона для «_Ty *» от «повышающего :: межпроцессного :: offset_ptr». Что я делаю не так?

+0

Что происходит, если вы пытаетесь создать файлы с отображением памяти, которые меньше? Как насчет 1/2 ГБ или 2 ГБ? –

+0

Все работает нормально. Я пробовал 0,5 ГБ, и проблем не было. Что-то еще я заметил, что использование памяти было около 1 МБ, а затем внезапно все остановилось. – TheShadow

+0

Итак, если вы создаете четыре файла объемом 0,5 ГБ, он отлично работает? –

ответ

1

boost :: iostreams вызывает функцию Win32 CreateFileMapping за кулисами here ... эта функция дает вам представление о файле. И обратите внимание, что нулевые значения, которые увеличиваются, передаются как dwMaximumSizeHigh и dwMaximumSizeLow аргументы - он запрашивает сопоставленный вид в том, что весь огромный файл.

Похоже, существует немало ограничений с помощью CreateFileMapping(), перечисленных here. Обратите внимание на часть, которая гласит: «Размер представления файла ограничен самым большим доступным непрерывным блоком незарезервированной виртуальной памяти». ... поэтому я думаю, что iostreams на самом деле просит вашу систему выделить огромный кусок виртуальной памяти, что, очевидно, помещает вашу систему в смертельную спираль.

Поскольку вы уже используете Boost, я бы дал вместо этого свою библиотеку interprocess. Он имеет хорошую поддержку файлов с отображением памяти, STL-подобные контейнеры, которые могут быть сопоставлены с MMF, и поддерживает отображение небольших областей этого огромного файла.

+0

Спасибо за ответ! Я обновил исходный вопрос с проблемами, которые я обнаружил при попытке использовать boost interprocess. – TheShadow

+0

@ TheShadow Я думаю, что ваше наблюдение заслуживает отдельного вопроса. –

+0

Выделение множества виртуальной памяти не должно влиять на другие программы, поскольку каждая программа имеет собственное виртуальное адресное пространство. – immibis