2011-01-08 4 views
1

Ich frage mich, was ich meine Puffer [] Größe einstellen, um Dateien in Ubuntu zu lesen.c maximale Größe für die Datei in ubuntu gelesen werden

Kennt jemand die maximale Größe, die mit Dateideskriptoren read() aus einer Datei gelesen werden kann.

Ich versuchte 1GB und segmentieren Fehler, versuchte 4 MB ist in Ordnung.

Nicht sicher, welche Char-Puffer [BUFSIZ] ist unterschiedliche Größe auf verschiedenen Plattformen?

Irgendwelche Vorschläge, was wäre die beste Größe, um Puffer zu setzen?

Dank

+0

Es gibt keinen Grund, große Stücke gleichzeitig zu lesen. Wenn Sie eine nicht-triviale Verarbeitung der Daten durchführen, ist 4-64k ausreichend groß, sodass die Leistung nicht verbessert wird, um mehr zu lesen. Wenn es sich um eine reine Kopie ohne Verarbeitung handelt, könnte es von Vorteil sein, diese etwas zu erhöhen, aber in jedem Fall sollten Sie einen größeren Puffer messen und niemals einen größeren Puffer verwenden, als Sie einen messbaren Nutzen daraus ziehen können. –

Antwort

3

Die Segmentation Fault Sie nichts empfangen hat mit einer maximalen Dateigrößen zu tun. Stattdessen weisen Sie einen Puffer auf dem Stapel zu, der den Stapelspeicherplatz Ihres Programms übersteigt.

Wenn Sie erklären, ein Array wie:

char buffer[BUFSIZ];

... es ordnet BUFSIZ Bytes auf dem stack. Die Menge an Stapelspeicher, die Sie haben, hängt von Ihrer Plattform und Ihrem Compiler ab, ist aber im Allgemeinen nicht größer als 1 GB. Bei einigen Linux-Distributionen mit gcc ist die Standard-Stack-Größe 8 MB.

Wenn Sie einen großen Puffer reservieren müssen, um die Datei zu lesen, müssen Sie sie auf dem Heap mithilfe einer der Funktionen malloc zuweisen.

char* buffer = malloc(BUFSIZ); 

Denken Sie daran, dass Sie auch den Puffer freigeben müssen, wenn Sie damit fertig sind.

free(buffer); 
0

Lesen Sie es nicht sofort. Die Puffergröße hängt tatsächlich davon ab, wie viel Sie zuweisen können. d. H. Ein paar MB mit dem Stack und praktisch unbegrenzte Verwendung von malloc (dank virtueller Speicher): in diesem Fall, wenn Ihre Datei mehrere GB ist, benötigen Sie dann so viel Speicher.

Lesen Sie es nur Block für Block mit Lese/Freed und Sie werden sicher sein. Niemand möchte seinen Speicher füllen, nur um eine Datei zu lesen. 4kB ist eine feine Puffergröße, da sie normalerweise die Größe einer Speicherseite hat. Und Sie können es auf dem Stapel ohne segfault problemlos zuweisen.

+0

Verwendung von malloc() wenn ich Puffer auf welche Größe der Datei setzt fstat was ist die maximale Größe, die es halten wird sagen, wenn die Datei 4GB war und ich char * buffer = malloc (fstat Ergebnis) wäre dies ein Problem oder ist der speicher unbegrenzt, dh keine grenzen? Oder gibt es ein Limit für die Speicherbelegung mit malloc()? – daza166

0

Das Lesen der maximalen Größe ist nicht unbedingt die effizienteste. In der Regel führt das Betriebssystem eine Pufferung darunter durch, daher ist die angeforderte Größe nicht immer sehr wichtig. Das Lesen der Sektorgröße (oft 4K) ist jedoch eine gute Größe für sequentielle Lesevorgänge.

3

Die Verwendung einer festen Größe für Ihren Puffer ist wahrscheinlich keine gute Idee. Sie wissen nie, wie groß eine Datei sein kann, wirklich ...

Das Lesen von großen Dateien in den Speicher möglicherweise auch nicht wünschenswert, aber wenn Sie müssen, dann sollten Sie zuerst in den Funktionen stat() und fstat() suchen, um herauszufinden wie groß die Datei wirklich ist, dann ordnen Sie den Puffer dynamisch unter Verwendung von malloc()/calloc() oder verwenden Sie mmap().

Sie können wahrscheinlich auch Google Informationen zur Verwendung dieser Funktionen finden.Es sollte auch Informationen über andere Möglichkeiten geben, um die Dateigröße einer Datei zu erhalten.

Aber wenn Sie es vermeiden können, lesen Sie keine großen Dateien in den Speicher. Lesen Sie stattdessen Bits davon und verarbeiten Sie diese Bits so wie Sie möchten.

+1

(+1) für die mmap() Beratung (http://linux.die.net/man/2/mmap). Die Dateibegrenzung wäre die Beschränkung des Speicheradressraums. –

0

Vergessen Sie nicht, dass jeder Dateisystem-Typ hat seine eigene Dateigröße Einschränkungen ist:

  • IBM General Parallel File System = 2^99
  • XFS = 8 EiB = 8 * 2^60
  • OCFS = 4 PiB = 4 * 2^50
  • ext4 = 16 TiB = 16 * 2^40
  • ext2/ext3 = 2 TiB = 2 * 2^40
Verwandte Themen