Como ler um arquivo de 4 GB no sistema de 32 bits

No meu caso, eu tenho arquivos diferentes, vamos supor que eu tenha um arquivo> 4GB com dados. Quero ler esse arquivo linha por linha e processar cada linha. Uma das minhas restrições é que o soft deve ser executado no MS Windows de 32 bits ou em 64 bits com pequena quantidade de RAM (mínimo de 4 GB). Você também pode assumir que o processamento dessas linhas não é um gargalo.

Na solução atual, eu li esse arquivoifstream e copie para alguma string. Aqui está um trecho da aparência.

std::ifstream file(filename_xml.c_str());
uintmax_t m_numLines = 0;
std::string str;
while (std::getline(file, str))
{
    m_numLines++;
}

E, ok, está funcionando, mas, lentamente, aqui está a hora dos meus 3,6 GB de dados:

real    1m4.155s
user    0m0.000s
sys     0m0.030s

Estou procurando um método que seja muito mais rápido do que isso, por exemplo, descobri queComo analisar flutuadores separados por espaço em C ++ rapidamente? e adorei a solução apresentada com boost :: mapped_file, mas enfrentei outro problema: se meu arquivo for grande e, no meu caso, um arquivo de 1 GB for suficiente para interromper todo o processo. Preciso me preocupar com os dados atuais na memória, provavelmente as pessoas que usarão essa ferramenta não terão mais de 4 GB de RAM instalada.

Então, eu achei esse mapped_file do boost, mas como usá-lo no meu caso? É possível ler parcialmente esse arquivo e receber essas linhas?

Talvez você tenha outra solução muito melhor. Eu tenho que apenas processar cada linha.

Obrigado,
Bart

questionAnswers(4)

yourAnswerToTheQuestion