Usando boost :: iostreams :: mapped_file_source com std :: multimap

Eu tenho uma quantidade bastante grande de dados para analisar - cada arquivo tem cerca de 5gigs. Cada arquivo tem o seguinte formato:

xxxxx yyyyy

Tanto a chave quanto o valor podem se repetir, mas as chaves são classificadas em ordem crescente. Estou tentando usar um arquivo mapeado de memória para esse fim e, em seguida, localize as chaves necessárias e trabalhe com elas. Isto é o que eu escrevi:

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";
}

Basicamente, preciso localizar faixas de teclas e puxar esses pedaços para trabalhar. Eu recebo um segfault na primeira vez que tento usar um método no multimap. Por exemplo, quando ofind método é chamado. Eu tentei oupper_bound, lower_bound e outros métodos também, e ainda obtém um segfault.

Isso é o quegdb me dá:

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))

Alguém poderia apontar o que estou fazendo de errado? Eu só consegui encontrar exemplos simplistas em arquivos mapeados na memória - nada disso ainda. Obrigado.

EDIT: Mais informações:

O arquivo que descrevi acima é basicamente um arquivo de texto simples de duas colunas que um simulador neural me fornece como resultado de minhas simulações. É simples assim:

$ 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

A primeira coluna é time, a segunda coluna são os neurônios que dispararam no momento - (é um arquivo raster de tempo de pico). Na verdade, a saída é um arquivo como este de cada classificação MPI que está sendo usada para executar a simulação. Os vários arquivos foram combinados com esse arquivo mestre usandosort -g -m. Mais informações sobre o formato do arquivo estão aqui:http://www.fzenke.net/auryn/doku.php?id=manual:ras

Para calcular a taxa de disparo e outras métricas do neurônio definidas em determinados momentos da simulação, eu preciso - localizar o tempo no arquivo, extrair um pedaço entre [tempo -1, tempo] e executar algumas métricas e assim por diante esse pedaço. Esse arquivo é muito pequeno e espero que o tamanho aumente um pouco, pois minhas simulações se tornam cada vez mais complicadas e são executadas por períodos mais longos. É por isso que comecei a procurar em arquivos mapeados na memória. Espero que isso esclareça um pouco a declaração do problema. Eu só preciso ler o arquivo de saída para processar as informações que ele contém. Não preciso modificar este arquivo.

Para processar os dados, usarei vários threads novamente, mas como todas as minhas operações no mapa são somente leitura, não espero que ocorram problemas nesse local.

questionAnswers(2)

yourAnswerToTheQuestion