с использованием MPI: С++ std::bad_alloc

я работаю с суперкомпьютером, используя MPI. но проблема в.. C++ есть программа, которая открывает файл с данными и читает его в vector<long>v1

    //open file
    ...
   vector<long>v1;

   while (!f1.eof()){
      //input data into 
      v1.push_back(s1);
   }

хорошо, когда файл данных содержит всего 50 миллионов «длинных чисел», он работал отлично. но когда файл данных содержит более 75 миллионов «длинных чисел», он не работает, за исключением:

   std::bad_alloc();

как это улучшить?

кроме того, использовать много процессоров (более 100)


person gaussblurinc    schedule 28.11.2011    source источник


Ответы (2)


Не используйте для этого вектор. Вектор требует, чтобы все его элементы помещались в последовательных ячейках памяти, и он не подходит для очень больших коллекций. Правильная структура данных зависит от ваших шаблонов доступа, list будет работать, но будет тратить много памяти (два указателя на каждый long, который вы храните). Возможно, вы захотите разбить long на группы по 100 или около того и составить связанный список этих групп. Опять же, правильный ответ зависит от вашей реальной внешней проблемы.

person David Schwartz    schedule 28.11.2011
comment
deque близок к вектору, но с фрагментированным хранилищем. (Очевидно, что управление этой фрагментацией выходит за рамки стандартного контроля.) - person GManNickG; 28.11.2011
comment
@GMan Было бы неплохо попробовать. Насколько хорошо это работает, будет зависеть от того, насколько «хорошей» (для его конкретной проблемы) является его реализация STL deque. Скорее всего, это решит его проблему. - person David Schwartz; 28.11.2011

Хотя у меня нет большого опыта работы с суперкомпьютерами (вообще), я могу сказать вам, что std::bad_alloc должен срабатывать только тогда, когда у вас заканчиваются системные ресурсы.

Скорее всего, в этом случае вы достигли предела, который компьютер накладывает на вашу кучу (либо с точки зрения операционной системы, либо с физической точки зрения {в конце концов, это одно и то же}), поскольку ваш вектор будет динамически распределять элементы на куча.

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

Еще одно замечание: вам следует создать свой вектор и вызвать его методом backup(), если вы знаете, сколько элементов он будет примерно использовать — это значительно повысит вашу эффективность.

person John Humphreys    schedule 28.11.2011
comment
Решение состоит в том, чтобы переключиться на более сегментированный контейнер, первым выбором будет deque, чтобы память можно было выделять фрагментами. Тем не менее, это (очевидно) ломает все, что зависит от непрерывности хранилища. - person GManNickG; 28.11.2011
comment
Я бы согласился с этим - бросьте это как ответ, так как я не думал об этом так далеко :) - person John Humphreys; 28.11.2011