2016-11-20 8 views
0

Angenommen, ich habe eine TXT-Datei mit der Größe von 9 GB. Und ich möchte nur das n-te MB lesen. (Ich weiß, was ist n). Aber mein Computer hat nur 4 GB RAM, so dass ich nicht alle Dateien gleichzeitig laden kann. Ich muss mehrmals auf verschiedene n zugreifen. Was ist der beste Weg, dies zu tun (Ich weiß nicht, ob der Standart Ifstream in der Lage ist, dieses Zeug zu tun).Große Dateien in C++ lesen

Antwort

1

Sie möchten in der Datei an einem bestimmten Ort "suchen". In C++ mit ifstream Sie seekg() verwenden: http://www.cplusplus.com/reference/istream/istream/seekg/

Zum Beispiel:

char data[1024*1024]; 
ifstream in("myfile.txt"); 
in.seekg(450 * 1024 * 1024, ios_base::beg); // skip 450 MB 
if (in.read(data, sizeof(data)) { 
    // use data 
} 
+0

Denken Sie daran, dass 'char data [1024 * 1024]' wird 1MB auf Stapel zuweisen, was ein Problem abhängig darstellen könnten auf Ihrem Stapelgrösse. Bei größeren Zuordnungen ist es besser, den Heap zu verwenden. Ändern Sie dazu einfach die Zeile in 'char * data = new char [1024 * 1024]'. –

+1

@JosipVujcic: Ich war bei dir, bis du "neu" benutzt hast. In C++ 14 können wir 'make_unique (1024 * 1024)' 'verwenden; in C++ 98 'std :: vector Daten (1024 * 1024)'. –

+0

Ich wollte nur auf mögliche Probleme hinweisen und eine einfache Lösung geben. Ich stimme Ihnen zu, dass die Verwendung von intelligenten Zeigern (in C++ 14) der beste Weg ist. –

0

Ist Ihr OS 64-Bit? Wenn ja, versuchen Sie mmap().

Auf modernen Betriebssystemen ist es möglich, eine Datei in einen Speicherbereich zu mappen (sprich: "em-map"). Wenn dies erledigt ist, kann auf die Datei genauso zugegriffen werden wie auf ein Array im Programm.

Dies ist effizienter als Lesen oder Schreiben, da nur die Bereiche der Datei geladen werden, auf die ein Programm tatsächlich zugreift. Zugriffe auf Noch nicht geladene Teile der mmapped-Region werden auf die gleiche Weise behandelt wie ausgelagerte Seiten.

Da mmapped-Seiten in ihre Datei zurückgespeichert werden können, wenn physischer Speicher niedrig ist, ist es möglich, Dateien um Größenordnungen größer als der physische Speicher und Swap-Speicherplatz zu mmap. Das einzige Limit ist Adressraum. Das theoretische Limit ist 4GB auf einer 32-Bit-Maschine - jedoch wird das tatsächliche Limit kleiner sein, da einige Bereiche für andere Zwecke reserviert sind. Wenn die LFS-Schnittstelle verwendet wird, ist die Größe auf 32-Bit-Systemen nicht auf 2 GB begrenzt (Offsets sind signiert, die den adressierbaren Bereich von 4 GB um die Hälfte reduziert); Die vollen 64-Bit sind verfügbar.

Speicherzuordnung funktioniert nur auf ganzen Seiten des Speichers. Daher müssen die Adressen für das Mapping page-aligned sein, und die Längenwerte werden abgerundet. up.

Weitere Informationen: