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
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
}
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:
- 1. große Dateien in C# Lesen
- 2. Große Dateien lesen und analysieren
- 3. Lesen sehr große .xml.bz2 Dateien
- 4. Sucht und große Dateien in einem Linux-C Lesen ++ Anwendung
- 5. Sehr große CSV und JSON Dateien lesen
- 6. Große Datei in Chunks lesen C#
- 7. Eine große Anzahl von Dateien schnell lesen
- 8. Große JSON-Datei in Variable in C# lesen. Net
- 9. Abgegrenzte Dateien in C++ lesen
- 10. JSON-Dateien in C++ lesen
- 11. C# - Große Datei in mehrere Dateien aufteilen
- 12. Unicode-Dateien lesen C++
- 13. Lesen von Daten aus Dateien in C
- 14. swfbridge und große Dateien
- 15. Eine große Anzahl von JSON-Dateien in Python lesen?
- 16. Der effizienteste Weg, um große Dateien in Chunks zu lesen
- 17. Java Große Dateien in Byte-Array lesen Chunk für Chunk
- 18. Wie kann ich sehr große Dateien lesen, ersetzen und schreiben?
- 19. Serving große Dateien mit C# HttpListener
- 20. C# lesen/schreiben .xlsm Dateien
- 21. C# Lesen von XML-Dateien
- 22. Große Datei in Python lesen
- 23. lesen schreiben mehrere Dateien in C++
- 24. Lesen (Schreiben) von Dateien in C#
- 25. Lesen von CSV-Dateien in C#
- 26. Apache Funke: Lesen Sie große Dateien aus einem Verzeichnis
- 27. Wie scapy Leistung zu verbessern, große Dateien zu lesen
- 28. direkt lesen große binäre Datei in C# w/out Kopieren
- 29. Lesen, formatieren und dann große CSV-Dateien schreiben
- 30. aio_write auf große Dateien
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]'. –
@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)'. –
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. –