Lendo com eficiência um arquivo de texto muito grande em C ++

Eu tenho um arquivo de texto muito grande (45 GB). Cada linha do arquivo de texto contém dois números inteiros não assinados, separados por espaço, de 64 bits, conforme mostrado abaixo.

4624996948753406865 10214715013130414417

4305027007407867230 4569406367070518418

10817905656952544704 3697712211731468838 ...

Quero ler o arquivo e executar algumas operações nos números.

Meu código em C ++:
void process_data(string str)
{
    vector<string> arr;
    boost::split(arr, str, boost::is_any_of(" \n"));
    do_some_operation(arr);
}

int main()
{
    unsigned long long int read_bytes = 45 * 1024 *1024;
    const char* fname = "input.txt";
    ifstream fin(fname, ios::in);
    char* memblock;

    while(!fin.eof())
    {
        memblock = new char[read_bytes];
        fin.read(memblock, read_bytes);
        string str(memblock);
        process_data(str);
        delete [] memblock;
    }
    return 0;
}

Eu sou relativamente novo em c ++. Quando executo esse código, estou enfrentando esses problemas.

Devido à leitura do arquivo em bytes, às vezes a última linha de um bloco corresponde a uma linha inacabada no arquivo original ("4624996948753406865 10214" em vez da sequência real "4624996948753406865 10214715013130414417" do arquivo principal).

Esse código funciona muito, muito devagar. Demora cerca de 6s para executar operações de um bloco em um sistema Intel Core i7 920 de 64 bits com 6 GB de RAM. Existe alguma técnica de otimização que eu possa usar para melhorar o tempo de execução?

É necessário incluir "\ n" junto com o caractere em branco na função de divisão de reforço?

Eu li sobre arquivos mmap em C ++, mas não tenho certeza se é a maneira correta de fazer isso. Se sim, por favor anexe alguns links.

questionAnswers(4)

yourAnswerToTheQuestion