Speicherleck in Batch für Schleife?

8

Ich schreibe ein Batch-Skript, das jede Datei in einem Verzeichnis durchsucht und nach Code-Dateien sucht und diese auf irgendeine Weise modifiziert. Nachdem ich diese Aufgabe beendet hatte, versuchte ich, sie in einem großen Verzeichnis mit ungefähr 6.000 Dateien auszuführen. Ungefähr 40 Minuten im Skript stürzten ab und ich bekam eine Menge Speicherfehler von der Eingabeaufforderung. Das Skript lief, während ich den Task-Manager sah, dass mein Programm Speicher mit einer Rate von 1MB pro Schleife Iteration gegessen hat. Da ich natürlich dachte, ich hätte etwas falsch gemacht, schneide ich den ganzen Code aus, den ich geschrieben hatte, um das Problem zu isolieren. Aber dann blieb mir eine leere Datei übrig, mit Ausnahme einer for-Schleife, und das Problem bestand immer noch!

Hier ist, was ich in einem ziemlich großen Verzeichnis ausgeführt habe, wie ich gesagt habe:

%Vor%

Ich konnte es tatsächlich auf

reduzieren %Vor%

Und das Problem besteht immer noch.

Gibt es ein Speicherleck im Batch für die Schleife oder mache ich gerade etwas falsch?

Ich verwende Windows XP 32bit Service Pack 2, obwohl ich getestet und bestätigt habe, dass das Problem immer noch in Service Pack 3 vorhanden ist.

    
Maynza 13.06.2011, 12:40
quelle

2 Antworten

2

Dies ist weniger eine Lösung als eine Umgehung (oder Neuschreiben). Ich habe Ihr Skript ausgeführt, und ich sehe etwas Speicherverbrauch, von denen einige nicht freigegeben werden, bis das Skript beendet ist, aber ich bekomme nicht annähernd 1 MB pro Iteration. (Genau wie @aphoria kann ich das Skript auf der Wurzel von c: ohne Probleme auf XP SP3 und Vista ausführen.)

Ich schlage vor, dass Sie einen Prozess schließen, der für das Skript nicht erforderlich ist, und führen Sie Ihr Skript gleichzeitig in einem Unterverzeichnis aus.

Wenn Sie das nicht anders lösen können, schlage ich vor, dass Sie versuchen, das Skript in Powershell zu schreiben.

    
steenhulthin 13.06.2011, 16:19
quelle
1

Das Problem liegt in der Tatsache, dass CMD.EXE und COMMAND.COM eine bestimmte Speichermenge für die Verwendung reservieren. Im Allgemeinen möchten Sie bei der Verwendung von Batch-Dateien für eine große Verarbeitungsmenge die Speicherauslastung erhöhen, die das Skript verwenden kann.

Abhängig von der Betriebssystemumgebung, die Sie ausführen, können Sie Folgendes tun:

  

WINDOWS NT / 2000 / XP: Sie können ändern   COMMAND.COM Umgebungsspeicher mit   der Schalter / e zum Beispiel:

%Vor%      

wird BatchFile.BAT in einer Shell mit ausführen   2048 Bytes Umgebungsspeicher.

  

WINDOWS 95/98 / ME: Sie können das ändern   Umgebungsspeicher in a zugewiesen   bestimmtes MS-DOS-Fenster oder in der   Verknüpfung zu einer bestimmten Batch-Datei.   Öffnen Sie den Eigenschaften Dialog   (Klicken Sie mit der rechten Maustaste auf die Verknüpfung oder den Desktop   Symbol und klicken Sie auf Eigenschaften).   Klicken Sie auf die Registerkarte Speicher. Verwenden Sie die Initiale   Environment-Pull-Down-Box, um a   Größe, die genug für Ihre Variablen ist,   sage 2048 Bytes (oder mehr, wenn du willst).

Um sicher zu gehen, würde ich auch Ihre Speicherbelegung erhöhen.

    
Mechaflash 13.06.2011 17:01
quelle