Wie man eine 4GB Datei auf einem 32bit System liest

In meinem Fall habe ich verschiedene Dateien angenommen, dass ich> 4GB Datei mit Daten habe. Ich möchte diese Datei Zeile für Zeile lesen und jede Zeile verarbeiten. Eine meiner Einschränkungen ist, dass soft unter 32-Bit-MS-Windows oder 64-Bit mit wenig RAM (mindestens 4 GB) ausgeführt werden muss. Sie können auch davon ausgehen, dass die Verarbeitung dieser Zeilen kein Engpass ist.

In der aktuellen Lösung habe ich diese Datei durchgelesenifstream und in eine Zeichenfolge kopieren. Hier ist ein Ausschnitt, wie es aussieht.

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

Und ok, das funktioniert, aber zu langsam ist hier eine Zeit für meine 3,6 GB Daten:

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

Ich bin auf der Suche nach einer Methode, die viel schneller ist als die, die ich zum Beispiel gefunden habeWie können durch Leerzeichen getrennte Floats in C ++ schnell analysiert werden? und ich mochte die vorgestellte Lösung mit boost :: mapped_file, aber ich stand vor einem anderen Problem, wenn meine Datei zu groß und in meinem Fall 1 GB groß genug war, um den gesamten Prozess fallen zu lassen. Ich muss mich um die aktuellen Daten im Speicher kümmern, wahrscheinlich haben Leute, die dieses Tool verwenden, nicht mehr als 4 GB RAM installiert.

Also habe ich diese mapped_file von boost gefunden, aber wie verwende ich sie in meinem Fall? Ist es möglich, diese Datei teilweise zu lesen und diese Zeilen zu empfangen?

Vielleicht haben Sie eine andere viel bessere Lösung. Ich muss nur jede Zeile verarbeiten.

Vielen Dank,
Bart

Antworten auf die Frage(4)

Ihre Antwort auf die Frage