Script zu langsam - Performancesteigerung möglich?

W

web4free

Jungspund
Hallo Leute,

Shellscripting ist wirklich eine geile Sache, wenn man sich ein bisschen auskennt.

Ich habe ein Script, welches einfach überflüssige Bilder in einen Verzeichnis ausforschen soll und diese ins Nirvana pfeffern soll.
Damit ich das realisieren kann habe ich folgender Versuchung nicht wiederstehen können.

Ich lese aus der MySQL Datenbank die Bildinfos aus - pro Datensatz 6 Bilder möglich.
Diese Dateinamen schreibe ich in 2 txt-Files (1. Originalbild und 2. Thumbs) damits ein bisserl schneller geht.
Dann lege ich einen neuen Ordner an und einen neuen Unterordner 'thumbs'.
Ich gehe dann in einer Schleife das ganze txt-File durch und kopiere die Bilder vom Ursprungsordner in den neuen Ordner.
Somit habe ich alle relevanten Bilder in diesen beiden neuen Ordnern.
Alles andere im Originalordner wird dann rekursiv gelöscht.

Ich denke das klingt doch recht vernünftig.
Bei 500 oder 1000 Bildern vielleicht ja, aber ich habe bereits über 700.000 Bilder die relevant sind und dann noch ca. 150.000 die leider Schrott sind, weil die durch irgendwelchen Blödheiten nicht wirklich von PHP gelöscht wurden. Und es werden täglich mehr relevante Bilder.

Naja und im jetztigen Zustand arbeitet das Shellscript gute 4 Stunden.
Wenn, dann mache ich es eh nur in der Nacht wo der Server mehr Ruhe hat.
Aber um 02:30h bekomme ich dann wieder neues Bildmaterial in Massen und da will ich eigendlich mit diesen Job fertig sein.
Sprich mein Zeitfenster wäre gerade mal 2,5 Std.

Gibt es da überhaupt eine Möglichkeit sowas zu beschleunigen.
Mein Code ist sicher nicht von der Besten Kinderstube und ich habe (weil .sh nicht geht) diesen auch als Anhang dazugehängt.
Seid bitte nicht zu streng mit mir - hier ist noch ein Greenhorn am werkeln....

Vielen Dank
lg.
Werner
 

Anhänge

  • imageclean.txt
    2,1 KB · Aufrufe: 21
Ich hätte grad mal eine Idee gehabt, bin mir aber nicht sicher obs sinnvoll ist und wie es sich umsetzen ließe.

Ich habe in einer txt-Datei jene Bildinfos aus der Datenbank die aktuell sind.
Was, wenn ich noch ein txt-File mache mit allen Dateien aus dem Verzeichnis und dann beide txt-Files vergleichen lasse und jene Dateinamen welche in beiden txt-Files vorkommen herauslösche aus der 2. txt-Datei.
Somit blieben ja nur noch jene Dateinamen über, die überflüssig sind und gelöscht werden könnten.
Das sind ja bedeutend weniger, als über 700.000 Dateien erst zu kopieren um dann ein Verzeichnis rekursiv zu löschen und das neue Verzeichnis umzubenennen.

Wenn das mehr Sinn macht - und es klingt danach - bräuchte ich nur eure Hilfe wie ich in einer Schleife die Dateinamen einlesen kann, beide txt-files vergleiche und die doppelten Einträge aus einen txt-File lösche.

Knade! Aber ich bin für jede Hilfe dankbar!
lg.
Werner
 
Hallo
Sorry, ich habe mir dein Skript nicht angesehen.
Aber ein paar Hinweise auf die Schnelle.
Überleg dir, welcher Fall dominierend ist.
1) Sind mehr Dateien zu löschen
2) Sind mehr Dateien nicht zu löschen
1) Such die Dateien raus und lösche den rest
2) Erstell dir eine Löschliste
Allgemein:
Beachte, dass ein Kopiervorgang länger dauert als ein Löschvorgang.
Ein Verzeichnis rekussiv zu löschen geht schneller, als die Dateien einzeln zu löschen.
Vermeide es, zu viele Einzelprozesse aufzurufen, das kostet Performance.

BTW Paste ein Skript doch mal hier rein und verwende dazu die [CODE] TAGS
Will sagen:
[CODE]
hier dein Skriptinhalt
[/CODE]

Gruß Wolfgang
 
anderer Ansatz: MySQL eine Liste aller Bilder erstellen und sortieren lassen und z.b. via SELECT INTO OUTFILE abspeichern. Dann ein find [...] | sort -u. Die beiden Dateien dann mit comm vergleichen und nur die überflüssigen Dateien löschen.

Das setzt natürlich voraus, dass aus den in der Datenbank referenzierten Bildern mithilfe eines SQL-Befehls die relevanten gefiltert werden können.

hth
 
Zurück
Oben