Использование 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, время] и запустить некоторые метрики и т. Д. этот кусок. Этот файл довольно маленький, и я ожидаю, что его размер увеличится немного, поскольку мои симуляции становятся все более и более сложными и работают в течение более длительных периодов времени. Вот почему я начал изучать файлы, отображенные в памяти. Я надеюсь, что это несколько проясняет постановку проблемы. Мне нужно только прочитать выходной файл, чтобы обработать информацию, которую он содержит. Мне не нужно изменять этот файл вообще.
Для обработки данных я снова буду использовать несколько потоков, но, поскольку все мои операции на карте предназначены только для чтения, я не ожидаю, что там возникнут проблемы.