2010-09-29 7 views
5

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?

+0

Können Sie die verwendete Sprache klären? –

+0

Ich werde fortfahren und rate C – wallacer

+0

Fread und Fseek sogar existieren als Standards in einer anderen Sprache? – wallacer

Antwort

2

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.

5

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.

+0

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

+0

@caf: Danke. Meine Antwort wurde geändert, wie Sie vorgeschlagen haben. –

2

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.

3

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.