Ich muss eine 16 GB Datei analysieren. Ich lese die Datei nacheinander unter Verwendung von fread()
und fseek()
. Ist es machbar? Wird fread()
für eine so große Datei funktionieren?Fällt fread für große Dateien aus?
Antwort
Es hängt davon ab, was Sie tun möchten. Wenn Sie die gesamten 16 GB Daten im Speicher lesen möchten, ist die Wahrscheinlichkeit groß, dass Ihnen nicht genügend Arbeitsspeicher oder Anwendungsspeicherplatz zur Verfügung steht.
Lesen Sie lieber die Daten Chunk für Chunk und die Verarbeitung dieser Chunks (und freie Ressourcen, wenn Sie fertig sind).
Aber neben all dem, entscheiden Sie, welchen Ansatz Sie machen möchten (mit fread()
oder istream
, etc.) und machen Sie einige Testfälle, um zu sehen, welche besser für Sie funktioniert.
Bei korrekter Implementierung sollte dies kein Problem darstellen. Ich nehme an, mit sequenziell meinen Sie, dass Sie die Datei in diskreten Blöcken betrachten und den Dateizeiger weiterleiten.
Check out http://www.computing.net/answers/programming/using-fread-with-a-large-file-/10254.html
Es klingt wie er war, wie Sie fast das gleiche tun.
Sie keine Sprache erwähnen, also werde ich C zu übernehmen
Ich sehe keine Probleme mit fread
, aber fseek
und ftell
Probleme haben.
Diese Funktionen verwenden long int
als den Datentyp, um die Dateiposition zu halten, anstatt etwas intelligentes wie fpos_t
oder sogar size_t
. Dies bedeutet, dass sie bei einer Datei mit mehr als 2 GB nicht funktionieren und bei einer 16 GB-Datei mit Sicherheit fehlschlagen können.
Sie müssen sehen, wie groß long int
auf Ihrer Plattform ist. Wenn es 64 Bit ist, geht es Ihnen gut. Wenn es 32 ist, haben Sie wahrscheinlich Probleme, wenn Sie ftell
verwenden, um die Entfernung vom Anfang der Datei zu messen.
Verwenden Sie stattdessen fgetpos
und fsetpos
.
Der Kommentar * ".. Sie können nicht rechtlich nicht-Null' fseek' Offsets ohne einen Aufruf an 'ftell'" * gilt nur für Dateien im Textmodus geöffnet. Dateien, die im Binärmodus geöffnet werden, können 'SEEK_SET' und' SEEK_CUR' mit beliebigen Offsets verwenden. – caf
@caf: Danke. Meine Antwort wurde geändert, wie Sie vorgeschlagen haben. –
Wenn Sie ein POSIX-ish-System verwenden, müssen Sie sicherstellen, dass Sie Ihr Programm mit 64-Bit-Dateioffsetunterstützung erstellt haben. POSIX schreibt vor (oder erlaubt zumindest, und die meisten Systeme erzwingen dies), dass die Implementierung IO-Operationen auf Dateien verweigert, deren Größe nicht in off_t
passt, auch wenn die einzige IO, die ausgeführt wird, sequentiell ohne Suche ist.
Unter Linux bedeutet dies, dass Sie -D_FILE_OFFSET_BITS=64
auf der gcc
Befehlszeile verwenden müssen.
Danke für die Antwort. Ich habe herausgefunden, wo ich falsch liege. fseek()
und ftell()
funktionieren nicht für Dateien, die größer als 4 GB sind. Ich benutzte _fseeki64()
und _ftelli64()
und es funktioniert jetzt gut.
- 1. fread (data.table) sperrt Dateien
- 2. Versionskontrollsystem für große Dateien?
- 3. Versionskontrolle für große Dateien
- 4. mmaping große Dateien (für persistente große Arrays)
- 5. pread für sehr große Dateien
- 6. Piecemeal bzcompression für große Dateien in PHP
- 7. swfbridge und große Dateien
- 8. Request.BinaryRead (Request.TotalBytes) löst Fehler für große Dateien aus
- 9. Warum fällt das Element aus?
- 10. Django-Dateisystemspeicher für große Anzahl von Dateien
- 11. Verwenden von Tornado für große Dateien
- 12. Speicher erschöpft: für große Dateien mit diff
- 13. Atomic delete für große Mengen von Dateien
- 14. Get MD5 Checksum für sehr große Dateien
- 15. Stream sehr langsam für große Dateien
- 16. Bester Texteditor für große JSON-Dateien?
- 17. Effiziente Zusammenführung für viele große CSV-Dateien
- 18. Hibernate - große Dateien speichern
- 19. Zeilenlimit für data.table in R mit fread
- 20. R data.table fread Nachrichten unterdrücken
- 21. Lesen von CSV-Dateien aus HDFS in R mit fread() und grep - verlorene Spaltennamen
- 22. data.table fread Funktion
- 23. CURL_RETURNTRANSFER Downloding große Dateien
- 24. Große Dateien in Git ablehnen
- 25. Android-Anwendung erfordert große Dateien
- 26. PHP: fseek() für große Datei (> 2GB)
- 27. Schnelles Lesen und Kombinieren mehrerer Dateien mit data.table (mit fread)
- 28. Wie entfernen Sie große Dateien aus dem Verlauf in Mercurial?
- 29. ANTLR4 Python Parsing große Dateien
- 30. fread Rückkehr falsche Daten
Können Sie die verwendete Sprache klären? –
Ich werde fortfahren und rate C – wallacer
Fread und Fseek sogar existieren als Standards in einer anderen Sprache? – wallacer