Warum schreibt AutoIT mein RAM voll ?

  • Hey, ich habe ein Programm am laufen, dass aus einem Hauptprogramm und mehreren kleinen Programmen besteht.

    Die Programme kommunizieren über .txt die dauerhaft geschrieben(FileWrite/FileWriteLine/_FileWriteFromArray) und wieder gelöscht werden, sobald sie gelesen wurden(FileDelete).

    Erstmal eine kurze Frage vorweg, was passiert mit den Dateien die mit FileDelete gelöscht werden ? Sind die komplett von der Festplatte weg oder landen die in einer Art Papierkorb und sind noch dauerhaft zwischengespeichert ?

    Jetzt die richtige Frage :)

    Die explorer.exe verbraucht durchgehend ca. 30000-50000kb Arbeitsspeicher. Sobald ich aber den Ordner öffne, in dem die .txt von den Programmen hin und her geschrieben werden, knallt die Arbeitsspeicherverwendung von der explorer.exe extrem hoch, bis mein kompletter Arbeitsspeicher ausgelastet ist und dannach wird dann die Festplatte mit der Auslagerungsdatei komplett vollgeschrieben.

    Solange ich aber den Ordner nicht öffne, passiert auch nichts mit dem Arbeitsspeicher.

    Zurzeit löse ich das Problem so, dass ich ein weiteres Kontrollprogramm am laufen habe, welches die explorer.exe neustartet sobald die Verwendung vom Ram auf >300000kb hoch geht.

    Das ganze ist aber etwas nervig, weil mir dadurch andauernt der Ordner geschlossen wird, in dem ich Arbeite...

    Ich hoffe ihr könnt mir weiterhelfen :D

  • Ich hoffe ihr könnt mir weiterhelfen :D

    Poste bitte einen Codeausschnitt, wie Du die .txt-Datei(en) öffnest, schreibst, schließt und löscht (siehe Vorschlag von autoiter )

    Hast Du das .txt Filehandling mal in einer Testumgebung ausprobiert, d.h. ein Hauptprogramm und zwei Unterprogramme, die mittels einer .txt kommunizieren (nur diesen Aspekt, nichts anderes) ?

    (Dass es ggf. andere (elegantere) Möglichkeiten der Kommunikation gibt, lasse ich vorerst weg)

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Vermutlich schreiben und lesen deine Scripte unverhältnismässig oft. Poste am besten dein Script, damit man dir den Fehler bzw. elegantere Lösungen zeigen kann. Es ist auch nicht unbedingt notwendig ständig die Dateien neu zu erzeugen bzw. zu löschen. Wenn man schon auf diese eher unperformante Art Daten austauscht kann man das auch anderst lösen.

    Die explorer.exe läuft vermutlich Amok, weil die Dateien viel zu schnell verschwinden und neu erstellt werden. der Explorer analysiert Dateien im Verzeichnis um z.B. das korrekte Verknüpfungsicon oder die integrierte Vorschau anzuzeigen, je nach Dateiformat und installierter Software. Auch für die Windows Suche müssen die Dateien indiziert werden.

  • Wenn so viele Daten geschrieben werden, wird deine Festplatte das vmtl. auch nicht sehr lange mitmachen... ich würd empfehlen, dass du, wenn du unbedingt bei Dateien zur übertragung bleiben willst, zumindest eine RamDisk verwendest (Wie ein normaler Ordner, nur dass er komplett im Arbeitsspeicher liegt und als Drive eingebunden wird). Die Dateien sind ja vmtl. nicht so groß, sodass ca. 1 GB ausreichen sollte... Dadurch würde die Geschwindigkeit des lesens/schreibens natürlich auch steigen ;)

    Ansonsten braucht man halt den Code und mehr Infos über die Datenmenge,... um bessere Tipps zu geben

  • Zwar sicher nicht die professionellste Art zwischen Prozessen zu kommunizieren, aber wie alpines vorgschlagen hat lassen sich auch beliebige (unsichtare) GUI controls zur Kommunikation missbrauchen. Habe ich selbst mal in einem Script mit mehreren ausgelagerten Prozessen verwendet. Vorteil war, dass es beachtliche Performance Vorteile brachte und man keine künstlichen Pausen einbauen musste um den beteiligten Prozessen genug Zeit zu geben die Datei fertig zu beschreiben. Das Abfragen der GUI verursacht auch keine vergleichbare Systemlast wie es Dateizugriffe in schneller Folge tun.

  • Sry erstmal für die verspätete Antwort und Danke für eure Antworten !

    einfach eine versteckte GUI nehmen und den Text in ein Inputcontrol setzen.

    Die Programme kommunizieren zwischen VM und normalem PC, denke dadurch funktioniert das leider nicht

    Wieso nutzt du nicht eine Datenbank?

    Habe leider keine Ahnung wie man eine Datenbank einrichtet

    Mal ganz dumm gefragt: Wie groß sind denn die Dateien überhaupt die du liest und schreibst?

    1kb-1000kb

    zumindest eine RamDisk verwendest

    Habe ich mir mal Installiert, läuft bis jetzt sehr gut. die explorer.exe wird bis jetzt auch nichtmehr vollgeschrieben(warum auch immer?)

    Öffne und schließe mal die Dateien mit jedem Schreibvorgang. Ist es dann besser?

    Bis jetzt öffne und schließe ich die Dateien noch nicht vor jeden zugriff. Da es jetzt mit dem RamDisk läuft werde ich ich erstmal so lassen, sollten aber wieder Fehler auftauchen werd ichs auf jeden fall ändern testen

    wie Du die .txt-Datei(en) öffnest, schreibst, schließt und löscht

    Filewrite(@WorkingDir & "\test.txt", $sText)

    so mach ichs auch mit dem löschen.

    Öffnen und schließen habe ich bis jetzt noch nicht drin, wie schon gesagt wird das sofort hinzugefügt, sobald wieder Fehler auftauchen!

    Wofür ist das öffnen/schließen von Dateien überhaupt wichtig ?

  • Ich kann es nur empfehlen sich mal Datenbanken generell mal anzuschauen. Da es diverse gibt, ist es schwer hier ein direktes HowTo etc. zu posten. So mit das gängiste ist MYSQL, aber es gibt halt viele andere gute Alternativen.

  • Habe ich mir mal Installiert, läuft bis jetzt sehr gut. die explorer.exe wird bis jetzt auch nichtmehr vollgeschrieben(warum auch immer?)

    Höchstwahrscheinlich deshalb, weil die RamDisk nicht zu den Orten gehört, die für die Windows-Suche indexiert wurden. Der Ort, an dem du die Dateien vorher erstellt/gelöscht hast, wurde aber sicherlich indiziert, weshalb die explorer.exe Amok läuft. Würdest du die Dateien an einen Ort verlegen, der nicht indiziert wird, würde die explorer.exe auch kein Amok laufen - es wäre aber dennoch die schlechteste Lösung.

    Wofür ist das öffnen/schließen von Dateien überhaupt wichtig ?

    Mit FileOpen kannst du explizit angeben, in welchem Modus die Datei geöffnet werden soll... z.B. ob die zu schreibenden Daten den bereits vorhandenen Inhalt überschreiben sollen ($FO_OVERWRITE), oder ob sie an das Ende angehangen werden sollen ($FO_APPEND).

    Datenbank... die benutze ich, wenn innerhalb der Daten komplexe Suchen durchgeführt werden müssen, ansonsten bevorzuge ich eine direktere/einfachere Lösung... z.B. via UDP oder TCP.