Использование boost :: iostreams :: mapped_file_source с std :: multimap

У меня достаточно большой объем данных для анализа - каждый файл составляет около 5 гигабайт. Каждый файл имеет следующий формат:

xxxxx yyyyy

И ключ, и значение могут повторяться, но ключи сортируются в порядке возрастания. Я пытаюсь использовать файл с отображенной памятью для этой цели, а затем найти необходимые ключи и работать с ними. Вот что я написал:

if (data_file != "")
{
    clock_start = clock();
    data_file_mapped.open(data_file);

    data_multimap = (std::multimap<double, unsigned int> *)data_file_mapped.data();
    if (data_multimap != NULL)
    {
        std::multimap<double, unsigned int>::iterator it = data_multimap->find(keys_to_find[4]);
        if (it != data_multimap->end())
        {
            std::cout << "Element found.";
            for (std::multimap<double, unsigned int>::iterator it = data_multimap->lower_bound(keys_to_find[4]); it != data_multimap->upper_bound(keys_to_find[5]); ++it)
            {
                std::cout << it->second;
            }
            std::cout << "\n";
            clock_end = clock();

            std::cout << "Time taken to read in the file: " << (clock_end - clock_start)/CLOCKS_PER_SEC << "\n";
        }
        else
            std::cerr << "Element not found at all" << "\n";
    }
    else
        std::cerr << "Nope - no data received."<< "\n";
}

По сути, мне нужно найти диапазоны ключей и вытащить эти куски для работы. Я получаю segfault в первый раз, когда я пытаюсь использовать метод на мультикарте. Например, когдаfind метод называется. Я попробовалupper_bound, lower_bound и другие методы тоже, и все еще получают segfault.

Это то, чтоgdb дает мне:

Program received signal SIGSEGV, Segmentation fault.
_M_lower_bound (this=<optimized out>, __k=<optimized out>, __y=<optimized out>, __x=0xa31202030303833) at /usr/include/c++/4.9.2/bits/stl_tree.h:1261
1261            if (!_M_impl._M_key_compare(_S_key(__x), __k))

Может кто-нибудь указать, что я делаю не так? Мне удалось найти только упрощенные примеры для файлов с отображенной памятью - пока ничего подобного. Благодарю.

РЕДАКТИРОВАТЬ: Больше информации:

Файл, который я описал выше, в основном представляет собой текстовый файл с двумя столбцами, который нейронный симулятор дает мне в качестве результата моих симуляций. Это просто так:

$ du -hsc 201501271755.e.ras 
4.9G    201501271755.e.ras
4.9G    total
$ head 201501271755.e.ras 
0.013800  0
0.013800  1
0.013800  10
0.013800  11
0.013800  12
0.013800  13
0.013800  14
0.013800  15
0.013800  16
0.013800  17

Первый столбец - время, второй столбец - нейроны, которые сработали в это время - (это растровый файл с всплеском времени). Фактически, выходные данные - это файл, подобный этому, для каждого ранга MPI, который используется для запуска симуляции. Различные файлы были объединены в этот мастер-файл с помощьюsort -g -m, Более подробная информация о формате файла находится здесь:http://www.fzenke.net/auryn/doku.php?id=manual:ras

Чтобы рассчитать частоту срабатывания и другие метрики нейрона, установленного в определенные моменты симуляции, мне нужно - найти время в файле, извлечь фрагмент между [время -1, время] и запустить некоторые метрики и т. Д. этот кусок. Этот файл довольно маленький, и я ожидаю, что его размер увеличится немного, поскольку мои симуляции становятся все более и более сложными и работают в течение более длительных периодов времени. Вот почему я начал изучать файлы, отображенные в памяти. Я надеюсь, что это несколько проясняет постановку проблемы. Мне нужно только прочитать выходной файл, чтобы обработать информацию, которую он содержит. Мне не нужно изменять этот файл вообще.

Для обработки данных я снова буду использовать несколько потоков, но, поскольку все мои операции на карте предназначены только для чтения, я не ожидаю, что там возникнут проблемы.

Ответы на вопрос(0)

Ваш ответ на вопрос