Miese Performance bei Dateizugriffen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Mittels os.walk() durchwandert mein winziges Python-Tool meine gesamte Festplatte rekursiv. Für jede Datei wird eine MD5-Summe angelegt und die Größe in Bytes ausgelesen.

Bei über 56.000 Dateien und 10 GB Speicherbedarf benötigte Python über 17 Minuten.

Im Vergleich dazu habe ich mir das Snapshot-Tool InCtrl5 herangezogen. In ca. 35 Sekunden erzeugte es von meiner gesamten Festplatte einen kompletten Dump. Es wurde mit Delphi 5 programmiert.

Puh, dachte ich: Wieso benötigt Python dafür 17 Minuten? Wofür braucht Python soviel Zeit? Liegt das an den Dateizugriffen oder an der MD5-Summe? Keine Ahnung... mich würde auch interessieren, wie InCtrl5 den Dump erzeugt, besonders ob dabei MD5-Summen berechnet werden... denn die fressen sicher viel Zeit, oder?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

droptix hat geschrieben: In ca. 35 Sekunden erzeugte es von meiner gesamten Festplatte einen kompletten Dump.
Hi droptix!

Ich kann mir nicht vorstellen, dass "InCtrl5" einen Dump erzeugt. Ich kenne das Programm zwar nicht, aber in der kurzen Zeit kann es wahrscheinlich gerade mal die Größe und die Zeitstempel der Dateien herausfinden und irgendwo ablegen. Eine MD5-Summe aller Dateien ist in der Zeit nicht machbar.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Das hört sich stark danach an dass InCtrl5 keine MD5-Summen erzeugt.

Viel schneller ist der MD5-Algorithmus auch nicht wenn Du alles drum rum in C programmierst, da die meiste Zeit Deines Programms in einer C-Extension (nämlich md5) zugebracht wird. Das walken der Platte ist relativ schnell (bei 35.000 Dateien dauert es aber auch halt 'ne Weile außer die gesamte Dateisystemstruktur ist im HD-Cache weil Du es eben gerade davor schon mal getan hast), aber sollte vergleichsweise wenig Zeit ausmachen bei der Menge an Bytes die Du abläufst.

Folgendes Beispiel demonstriert das noch mal:

Code: Alles auswählen

modelnine@phoenix ~ $ dd if=/dev/urandom of=test bs=1M count=1000
1000+0 Datensätze ein
1000+0 Datensätze aus
1048576000 bytes (1,0 GB) copied, 272,893 seconds, 3,8 MB/s
modelnine@phoenix ~ $ time md5sum test
22ea8aadc8728a917fde44fbcd952881  test

real    0m57.059s
user    0m4.808s
sys     0m1.832s
modelnine@phoenix ~ $
Auf meinem System (Turion MT-32 bei 1800 Mhz) braucht es schon eine Minute um auf einer flache Datei mit der Größe 1GB eine MD5-Summe zu bilden, wobei das gros der Datei im Festplattencache war (2 GB Arbeitsspeicher). Jetzt multiplizier das mit zehn, und überleg dann noch dazu dass bei Dir die meißten Dateien nicht im Festplattencache waren, etc. etc. etc., dann hört sich die Zahl 17 Minuten gar nicht schlecht an.

--- Heiko.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Eben! Das dachte ich mir auch. Deshalb frage ich mich, wie InCtrl5 das macht. Es ist meiner Meinung nach das beste frei erhältliche Tool.

Es hat angeblich nur eine einzige Schwäche: Registry-Values länger als 1024 Zeichen. Die sind zwar noch relativ selten, aber werden bei den ständig wachsenden Programmen zunehmen Mode...

Systemsherlock ist auch nicht schlecht, aber es hat wohl Probleme, wenn es z.B. über den "System Volume Information" Ordner von Windows stolpert. Da rieselt es Fehlermeldungen. Es ist ein reines Kommandozeilen-Tool und jedenfalls auch ultra-schnell.

Bei InCtrl5 weiß ich, dass die Erkennungsrate bei Änderungen an einer Datei sehr gut hinhaut. Die Frage ist: wie macht es das? Wird da ein schnellerer Hash als MD5 abgelegt oder wird das nur aus dem Datum und der Dateigröße bemessen? letzeres fände ich persönlich nicht ganz korrekt, obwohl es für die meisten Fälle sicherlich ausreicht, um Änderungen am System festzustellen.

Gibt es dafür einen schnelleren Hash, der aber ebenso zuverlässig wie MD5 ist?

Ich habe zwar den Quellcode von InCtrl5, darf ihn aber aus rechtlichen Gründen sicherlich nicht im Forum posten. Vor einigen Jahren konnte man das Ding noch kostenfrei vom PC Mag runterladen -- Quellcode inklusive. Wer Interesse hat, dem kann ich das ja mal per Mail zukommen lassen... ist auch nicht groß. Wie gesagt: Delphi 5.
mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

droptix hat geschrieben:Gibt es dafür einen schnelleren Hash, der aber ebenso zuverlässig wie MD5 ist?
Ich glaub nicht dass du mit einem anderen Hash viel besser fährst.

Um ihn zu erzeugen musst du ja trotzdem die ganze Datei einlesen - Alleine das dauert ja schon...

Kommt halt vor allem auf die angepeilte Zeit an.
Wenn du den Quellcode hast, schau halt nach ob InCtrl5 einen Hash erzeugt.
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Wird da ein schnellerer Hash als MD5 abgelegt oder wird das nur aus dem Datum und der Dateigröße bemessen?
Sicherlich letzteres. Und das _kann_ bei Programmen die es darauf anlegen sich vor InCtrl5 zu verstecken nicht sonderlich korrekt sein.

Sonst, schnellere Hashes als MD5? CRC-* sind ein ganzes Stück schneller, allerdings im Gegensatz zu MD5 auch nicht kryptographisch sicher. Das bedeutet: es ist relativ einfach eine Kollision zu finden, so dass eine Datei die selbe CRC-Summe hat, aber trotzdem der Inhalt unterschiedlich ist. Und auch CRC schafft es nicht 10 GB Daten innerhalb von 35 Sekunden zu durchlaufen, außer Du hast ein Monstersystem.

--- Heiko.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

droptix hat geschrieben:In ca. 35 Sekunden erzeugte es von meiner gesamten Festplatte einen kompletten Dump.
Das das nicht sein kann, kannst du schon daran sehen, dass das eine Datenrate von 292 MB/s ist. Ich glaube kaum, das deine Platte die Daten so schnell liefern könnte.

Ich hab den Sourcecode von InCtrl mal kurz überflogen, es scheint sich immer nur spezielle Teile aus der Datei anzuschauen; bei EXE z.B. den Description String etc.

Also kein Tool, das Sicherheit vor wissentlicher Datenmanipulation bietet.
Antworten