virusshare.com Scanner

  • Und schon bin ich wieder hier! :saint:

    Hätte ich nicht von Oscar, in der chatbox, gelesen das er es geschafft hat 28.508.160 Elemente in 8 Minuten in das Scripting.Dictionary Object zu pressen. Würde ich euch hier wohl nicht belästigen.
    Ich werde direkt das Ganze script posten. Bitte verzeiht mir die Unordnung mit den Variablen, das habe ich wohl noch nicht ganz so drauf. Allerdings denke ich das es trotzdem lesbar ist, ich markierte auch förderlich die abschnitte.

    In der Section ;<============Read DataBase===========>[...];<============/Read DataBase===========>,
    offenbare ich meine lösung um die Elemente einzulesen. Allerdings brauch das Script bei mir hier unzählbare Stunden & RAM.


    Das script wird Morgen auseinander genommen. So das ich einen Baum an Shell's kreieren kann die jeweils zuerst die zu überprüfenden daten hasht, um die HDD nicht zu verlangsamen, & danach die CPU stresst.


    Vielleicht interessiert es jemanden wie es bis jetzt aussieht. Deshalb hier vollständig, aber nach der Objekt implentierung nicht mehr funktionstüchtig, wollte mich zuerst um das einlesen der hases kümmern.


    • _FileReadToArray() war früher für das Einlesen einer kompletten Datei zuständig. Heute ist es eher eine Spezialversion mit welcher man z.B. csv-Dateien in 2D-Array-Form bekommt. Für die Aufgabe eine Datei zeilenweise komplett in ein Array zu lesen gibt es die Built-In-Funktion FileReadToArray (ohne Unterstrich) welche etwas flotter arbeitet.
    • Wenn man die Kodierung der Datei schon kennt und diese fest ist, kann man die Datei per FileOpen (FileClose aber nicht vergessen!) und der Angabe der Kodierung öffnen und spart sich so den Check beim Einlesen. Das sorgt für ein flotteres Einlesen.
    • _ArrayDelete bei den ersten Elementen sorgt dafür dass alle dahinter stehenden Elemente einzeln nach vorn kopiert werden und am Ende das Array entsprechend gekürzt wird. Das dauert also ziemlich lange um nur 6 Elemente zu entfernen. Vor allem da dies hier nicht nötig scheint. Passe doch einfach deine Zählvariablen entsprechend darauf an und lass das Array so wie es ist dann sparst du dir das aufwendige _ArrayDelete.
    • Mit der Funktion von >>Hier<< in Verbindung mit $ReadDBarTemp = StringSplit(_FileReadFast($db_files[$idb], 512), @CRLF, 1) (die 512 an deine Kodierung anpassen oder ganz weglassen) lässt sich die Datei etwas schneller in ein Array einlesen.
    • Ein paar Miniprozente kannst du noch rausholen wenn du stattdessen schreibst:
      AutoIt
      $oDict($ReadDBarTemp[$igb-1]) = $ReadDBarTemp[$igb]

      Außerdem wird damit kein Fehler geworfen wenn der Eintrag schon existiert sondern einfach überschrieben.

    • Die Benutzung des Inkrement-Operators sorgt noch für ein paar Promille (fast schon an der Grenze zum homöopatischen Wirkbereich): $count += 1; $add += UBound($ReadDBarTemp) - 1
    • Der Ausdruck UBound($ReadDBarTemp) - 1 wird dreimal verwendet und damit ausgewertet ohne dass sich dessen Wert ändert. Eine einmalige Auswertung und Speicherung in eine Variable zur späteren Wiederverwendung bietet sich an.
    • Wenn der RAM tatsächlich dein Problem ist und die einzulesenden Dateien sehr groß, dann könnte man auch, anstatt die komplette Datei als Array in den Speicher zu knallen auch die Datei zeilenweise per FileReadLine (auch hier gilt der Trick mit der Kodierung bei FileOpen) abarbeiten. Ähnlich schnell aber mit deutlich weniger Speicherverbrauch, da hierbei nur die aktuelle Zeile im Speicher liegt.
    • Offizieller Beitrag

    Ich hatte gestern abend leider keine Zeit mehr.
    Hier ist mein Testscript:

    Wie bereits geschrieben, habe ich nicht die einzelnen Dateien runtergeladen, sondern unten das ganze Paket (120MB).

  • Habe jetzt erstmal im SB-Archiv gelesen was ihr eigentlich vorhabt.
    Die Anzahl der Elemente ist so groß, dass man statt dem Dictionary-Objekt besser auf eine HashTable ausweichen sollte, da diese im Gegensatz zum Dictionary bei vielen Elementen nicht spürbar langsamer wird.
    Noch besser wäre eine hashbasierte Set aber die gibt es für AutoIt leider nicht.

    Auch wenn es wahrscheinlich immer noch ewig dauert wäre das mein Vorschlag für das Einlesen der einzelnen md5-Dateien:

  • @AspirinJunkie & @Oscar. Mir fehlt die Zeit um auf jede Linie einzugehen deshalb kurz & knackig. Alle tipps & vorschläge werden dem Script mitbeigefügt.

    So kann ich mich endlich mal besser mit Objekten beschäftigen, jetzt da wo sie benötigt werden :)

    _ArrayDelete() war doch recht fügig & fix, allerdings sollte in jedem bereich volle Performence beachtet werden, deshalb werden die 6 ersten zeilen gesucht & mit einem zufälligen Wert ersetzt(natürlich nicht auf hash länge, um keine falsch meldungen zu projezieren). Dann mal danke ich schließe das Thema, da mir das so denke ich ausreichend helfen wird :)