2 Stimmen

Win32-Datei-E/A erschöpft den Systemspeicher

Ich habe ein Programm, das Dateien konvertiert. Es nimmt einen Eingabedateinamen und einen Ausgabedateinamen, liest aus der einen und schreibt in die andere, mit einigen Änderungen. Ich habe den Quellcode, aber er ist sehr umfangreich, und ich habe kein klares Bild von seiner Funktionsweise. Ich kann sagen, daß die Dateien mit _wsopen_s im Schreib-Lese-Modus (_O_RDWR) geöffnet werden, und es scheint beim Öffnen keine komischen Vorgänge zu geben.

Aus irgendeinem Grund passiert Folgendes, wenn ich versuche, dieses Programm mit einer bestimmten großen Eingabedatei zu verwenden. Zunächst steigen der physische Speicherverbrauch und der für den Dateisystem-Cache verwendete Speicher (wie vom Task-Manager gemeldet) an. Es scheint, dass für jedes gelesene und geschriebene Byte der Speicherverbrauch um 2 Byte ansteigt. Beachten Sie, dass dies der Speicher ist, der dem Betriebssystem : Die Commit-Größe und die Größe der Arbeitsmenge der eigentlichen ausführbaren Datei bleiben konstant.

Wenn sich dann die Größe des Dateisystem-Caches dem gesamten verfügbaren Speicher nähert, beginnt das Betriebssystem, laufende Programme in die Auslagerungsdatei auszulagern, und schließlich reagiert das System nicht mehr.

Die Autoren des Programms sagen, dass sie diese Art von Verhalten noch nie gesehen haben und sie wissen nicht, warum dies der Fall sein könnte.

Bevor ich das offiziell als Fehler melde und versuche, dass sie ihn beheben (was lange dauern kann, und ich brauche das Programm jetzt):

  • Gibt es irgendetwas im Quellcode, nach dem ich suchen kann, eine Art hinterhältiger Funktionsaufruf, der dieses Verhalten auslösen könnte?
  • Kann ich dem Betriebssystem sagen, dass es das nicht tun soll?
  • Und, ganz allgemein, was soll's?

Dies geschieht auf x64 Vista Home Premium SP2.

0voto

nonopolarity Punkte 138211

Wenn das Programm Speicher verwendet, der direkt proportional zu Ihrer Eingabedatei ist, dann sieht es so aus, als ob das Programm versucht, alles auf einmal in einen Speicherpuffer zu lesen.

Ein typischer Weg, dies zu verbessern, ist das Einlesen in einen Puffer, der auf 200kb oder mehr begrenzt ist, und die Verarbeitung und das Herausschreiben der konvertierten Daten, die an die Ausgabedatei angehängt werden. Auf diese Weise wird der Systemspeicher nicht erschöpft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X