Hallo,
bei deinem letzten Screenshot hast du den "Window"-Tab offen. Das heißt dort siehst du die Eigenschaften des ganzen Fensters.
Gehe mal auf den nächsten Tab "Control". Dort sollte sich etwas ändern, wenn du mit der Maus über die Verschiedenen Elemente fährst.
Beiträge von MorsGER
-
-
Hallo alle zusammen! Ich bin es euch wohl noch schuldig zu antworten.
Erst einmal herzlichen Dank für eure zahlreichen Beiträge und eigenständigen Versuche!
Eure Scripts funktionieren bei mir in ähnlichem Tempo, der PC war also nicht der Punkt.Ich werde mich wohl in die Ecke verziehen und schämen müssen.
Der Flaschenhals und mein großer Fehler war die Verwendung von _ArrayAdd.In meinem Eröffnungsbeitrag schrieb ich etwas von 5mio Zeilen, drum habt ihr auch 5mio Zeilen verwendet - vollkommen richtig!
Ich habe mein Script jedoch über meine fertige Datei laufen lassen, welche ungefähr 5mio Zeilen hatte. Drum habe ich jede Zeile per FileReadLine eingelesen und dann per _ArrayAdd an meinen (nicht vorher komplett definierten Array) File-Array gehangen. Da ich zwei dieser Dateien gleichzeitig eingelesen habe ist er immer zwischen den Dateien hin und her gesprungen und hat somit 2 _ArrayAdd Befehle pro Zeile durchgeführt.
(Entsprechend ging ich auch beim Buffer vor, der immer "resettet" wurde und dann erneut - sinnloserweise - 1000 Zeilen eingelesen hat.)Ich habe also versucht mit eurer Hilfe die Symptome zu bekämpfen, ohne das eigentliche Problem anzugehen - welches ich euch aber ja auch verschwiegen habe, da ich es nicht ansatzweise dort vermutete.
Dank euch habe ich also nun ein millionenfach schnelleres Script schreiben können!
Ich bedanke mich also noch mal ganz herzlich bei euch & für eure Geduld mit mir!
-
Ich danke euch allen schon mal vielmals um eure Hilfe. Ich vermute aber es gibt einfach keine Möglichkeit es noch schneller zu machen.
Die besten Ergebnisse hatte ich nun tatsächlich, wie im ersten Beitrag beschrieben, indem ich die Dateien im Vornherein aufspalte und einzeln in tragbaren Größen per _FileReadToArray einzulesen. Das dauert zwar immer noch ein paar Minuten, aber bei weitem nicht mehr eine halbe Stunde.Aber falls trotzdem noch jemand eine Lösung parat hat, beantworte ich noch die offenen Fragen:
@alpines - Im Eröffnungsbeitrag sprach ich irrtümlich von "FileRead". Eigentlich meinte ich damit "FileOpen", was wohl auch die Vermutungen in die falsche Richtung gelenkt hat.
Das einlesen der Bytes wäre tatsächlich ein guter Ansatz, den ich mal noch überprüfen werde.@Oscar - Es sind exakt 52 (inkl. CR & LF) Zeichen pro Zeile vorhanden.
Ja, die Datenbank ist Zeilenbasiert. Pro Zeile steht ein Wert mit 50 Zeichen + CRLF.
Letzteres dürfte eigentlich nicht der Fall sein.Ich danke euch nochmals für eure Zeit und Bemühungen und werde das hier als erledigt markieren.
Eine schöne Winterzeit wünsche ich euch! -
Dann danke ich dir für deine Mühen.
Genau nach "dem Buffer" suche ich. Mein bisheriger Buffer funktioniert so:- Öffne Datei mittels Filehandle.
- Lese eine vorgegebene Anzahl an Zeilen aus der Datei (-> 1.). Ohne die Verwendung von Zeilennummer ö.ä.
- Verarbeite die bisherigen eingelesenen Daten (Bsp.: 1000 Zeilen)
- Gehe wieder zu 2.
- Wenn fertig dann Handle schließen.
Die Verwendung von FileSetPosition ist in diesem Fall unnütz, da die Datei genau an der Position weitergelesen wird wo man zuletzt gelesen hat. Somit habe ich deinen vorgeschlagenen Buffer schon umgesetzt, mit dem Ergebnis, dass das Script anstatt mehrerer Stunden nur noch 30 Minuten für die Muster-Datei brauchte.
-
Berechne dir mal die Geschwindigkeit mit Timern und lass dir die mal ausgeben, eventuell ist deine HDD in Kombination mit AutoIt einfach zu langsam?
Vielleicht versuchst du mal mehrere Zeilen gleichzeitig einzulesen mit einem Buffer von 2 MB? Dann hast du auch die Zugriffszeiten auf die HDD nicht mehr.Die Hinweise in deiner Antwort kann ich nun nicht ganz nachvollziehen.
Dein Beispiel macht meine Festplatte ebenso innerhalb max. 1 Millisekunde, inkl. dem öffnen und schließen des Handles. Ich würde es für unwahrscheinlich halten, dass sich die Lesegeschwindigket von 2 handelsüblichen Festplatten um ein 2-millionenfaches unterscheiden.
Dein Vorschlag des "Buffers" schrieb ich ja bereits in meinem ursprünglichen Beitrag, sowie wies im letzten darauf hin.
Danke trotzdem für deinen Beitrag.
-
Danke für den Hinweis, AspirinJunkie!
Also nochmal zur Aufklärung:
Als ich mich bei diesem Projekt dem FileReadLine zuwendete war mein erster Ansatz (wie ihr alle vermutet) eine Schleife sowie eine Zeilennummer als Parameter:
Code$File = FileOpen("test.txt") For $t = 1 To 5000000 $output = FileReadLine($File, $t) ;Sonstiger Code Next FileClose($File)
Da dieses Script bei jedem Durchgang aber langsamer wurde (und die Zeilennummer nicht vonnöten ist) änderte ich es zu:Code$File = FileOpen("test.txt") For $t = 1 To 5000000 $output = FileReadLine($File) ;Sonstiger Code Next FileClose($File)
Das ist nun natürlich nur ein Beispiel da ich es (ähnlich dem 2. Fall) so umgebaut hatte, dass die Schleife immer nur 1000 Zeilen auf einmal einliest ..@alpines
Lediglich eine Zeile zu lesen geht natürlich deutlich schneller als 5mio. -
Benutze FileReadLine niemals mit Angabe der Zeilennummer, wenn Du die ganze Datei durchgehen willst! Das dauert ewig.
Das steht ja so in der Help-File von "FileReadLine". Drum schrieb ich, dass ich die Datei über den FileHandle einlese - war aber wohl etwas unverständlich formuliert.
Aber danke nochmal für den Hinweis.Hast du bei FileReadLine das Handle der Datei durch FileOpen genommen oder einfach den Dateipfad? Mit dem Handle sollte das um einiges fixer gehen.
Wenn du im vorhinein schon auf 10 MB aufteilen kannst ist das okay aber wenn du das im Script machen musst killt dir das dennoch deine Laufzeit oder nicht?
- Genau. Habe den FileHandle genommen.
- Ja, ich würde die Datei einmalig splitten, sodass zukünftig die "portionierten" Dateien bereitliegen. Während der Laufzeit wäre das tatsächlich sinnlos.Aber ich danke für euren Beitrag!
-
Hallo AutoIT-Community,
ich stehe bei einem aktuellen Projekt vor der Aufgabe große (500+ MB / 5Mio+ Zeilen) Dateien (=Datenbank) einzulesen und relevante Daten in einem Array abzuspeichern. Im Vornherein sei also gesagt, dass ich nicht die gesamte Datei im Arbeitsspeicher brauche. Fakt ist, dass meine bisherigen Versuche an verschiedenen Dingen scheiterten. Hauptsächlich aber an der benötigten Zeit.
Meine bisherigen Ansätze waren:
- FileReadToArray - Ich habe die gesamte Datei versucht einzulesen um sie dann im Arbeitsspeicher zu untersuchen.
Gescheitert an: Das Skript ist irgendwann abgestürzt. Vermutlich weil AutoIT mit der Datenmenge nicht umgehen konnte. RAM war um ein vielfaches der Dateigröße ausgelastet. - FileRead / FileReadLine - Ich habe die Datei als Handle, und dann zeilenweise eingelesen. Hierbei ging ich schrittweise vor, sodass er ressourcensparend immer nur 1000 Zeilen im RAM hat.
Gescheitert an: Benötigte Zeit (~30 Minuten). Generell ist bei vielen Zeilen FileReadToArray deutlich im Vorteil. Somit ist das Skript super langsam wenn es jede Zeile einzeln einliest.
Mit meinen (zusammengefasst) zwei Ansätzen hatte ich also bisher keinen Erfolg. Mein neuer Ansatz wäre komplett die Dateien in kleine (10MB) Portionen aufzuteilen und einzeln per FileReadToArray einzulesen. Dieser Lösungsweg ist mir aber nicht so lieb, da ich gerne ein übersichtliches Daten-System pflege, ohne hundert von ähnlichen Dateien.
Hat jemand von euch vielleicht ein effektiveren Ansatz parat? Ich bin über jede Hilfe dankbar!
Freundliche Grüße!
- FileReadToArray - Ich habe die gesamte Datei versucht einzulesen um sie dann im Arbeitsspeicher zu untersuchen.
-
Hey, AutoIT-Community!
Ich arbeite derzeit an einem Programm, bei dem ich mir die Funktion eines web-basierten Tools zunutze machen möchte.
Das funktioniert, indem man in ein Textfeld die gewünschte Option eingibt, auf Submit drückt (bis hierhin alles kein Problem) und dann aus den gegebenen Informationen ein Objekt erstellt wird.
Einzusehen ist das, wenn man es normal im Browser ausführt, per F12 unter "Network".Ähnlich läuft es bei z.B. Soundcloud ab. Wenn man bei einem Lied auf Play drückt, ist unter "Network" die geladene MP3 zu sehen.
Nun möchte ich dieses erstellte Objekt (Bsp. Soundcloud: die MP3) abspeichern, um bei erneutem Bedarf auf eine lokale Datenbank zugreifen zu können und es nicht erneut anfordern muss.
Wünschenswert wäre eine Lösung mit der IE-UDF, da ich mich mit Chrome und Firefox bisher nicht beschäftigt habe. (Programmiere meistens im Offline-Bereich)
Vielen Dank für etwaige Lösungsansätze! Oder Aufzeigen von Möglichkeiten die ich übersehen habe.. ;p -
Hui hui hui .. Das du das so tatsächlich praktisch anwenden möchtest wusste ich nicht. Ich dachte dir geht es mehr um die einzelnen Befehle und das Lernen dieser.
Wie die anderen schon schrieben kann man dir ziemlich schlecht helfen wenn man nicht genau weiß was du eigentlich machen möchtest. (im Browser rum klicken.. soweit sieht man das..)Aber deinen Teil mit dem Screenshot hättest du kürzen können zu:
Code#include <ScreenCapture.au3> ;... Dein Programm ... _ScreenCapture_Capture("E:\AScreenshots\" & $dateiname & ".jpg")
Um dir bei den anderen Sachen helfen zu können braucht man aber wohl Informationen zu dem was du vorhast.
Viel Spaß und Erfolg weiterhin!
PS: Den Rat sich zu Herzen nehmen, sich selbst die Funktionen zu erarbeiten, ist auf keinen Fall falsch. Du wirst viel besser wenn du deine Programme vollständig selbst geschrieben hast.
-
Hi, entweder freundest du dich tatsächlich mit der ExcelUDF an, ich konnte mich aber auch nicht anfreunden, deshalb nutze ich lieber die Tastatur.
In einem Beispiel wäre das:Spoiler anzeigen
Ansonsten könntest du das mit der Maus so realisieren:
Spoiler anzeigen
Viel Erfolg!