Ich lese etwa 6000 Textdateien mit folgendem Code in einer Schleife in den Speicher:
%Vor% In der Iteration 2826 erhalte ich beim Öffnen der 2826. Datei einen Fehler " Zu viele offene Dateien ".
Bis zu diesem Punkt ist in der Close-Operation kein Fehler aufgetreten.
Da es immer in der 2826. Iteration hängt, glaube ich nicht, dass ich warten sollte, bis eine Datei wirklich geschlossen wird, nachdem close();
aufgerufen wurde
Ich hatte das gleiche Problem mit fopen, fread und fclose.
Ich glaube nicht, dass es mit dem Kontext dieses Snippets zu tun hat, aber wenn du es tust, werde ich es bereitstellen.
Danke für deine Zeit!
BEARBEITEN:
Ich legte das Programm in den Ruhezustand und überprüfte / proc // fd / (danke an nos). Wie du vermutest, gab es genau 1024 Dateideskriptoren, die ich als übliche Grenze empfand.
+ Ich habe dir die ganze Funktion gegeben, die Dokumente aus einem Verzeichnis und allen Unterverzeichnissen liest
+ Das Programm läuft unter Linux! Entschuldigung für das Vergessen!
Sie müssen nach einer Schleife coventir () aufrufen. Das Öffnen eines Verzeichnisses verbraucht auch einen Dateideskriptor.
Möglicherweise treffen Sie das Betriebssystemlimit für # erlaubte offene Dateien. Wenn Sie nicht wissen, welches Betriebssystem Sie verwenden, sollten Sie Ihr OS + "zu viele offene Dateien" googlen, um herauszufinden, wie Sie das beheben können. Hier ist ein Ergebnis für linux, Ссылка
Ich habe das Problem gelöst, indem ich zu /etc/security/limits.conf
* soft nofile 40960
* hard nofile 102400
Problem war, wenn sich bei debian einloggen zeigt ulimit -n 40960
, aber wenn su Benutzer, ist es wieder 1024
.
Sie müssen eine Zeile in /etc/pam.d/su
session required pam_limits.so
Dann immer benötigte Limits
Sie sollten covenir () aufrufen, da opendir auch den Deskriptor zurückgibt Wie im Linux-System-Maximum kann so viel Zeit / proc / sys / fs / file-max-Datei geöffnet werden obwohl Sie diese Zahl erhöhen / verringern können