используя MPI: C ++ std :: bad_alloc - PullRequest
1 голос
/ 28 ноября 2011

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

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

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

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

   std::bad_alloc();

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

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

Ответы [ 2 ]

4 голосов
/ 28 ноября 2011

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

1 голос
/ 28 ноября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...