Umfangreiches Verzeichnis einlesen


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Sprint

Erfahrenes Mitglied
#1
Hallo zusammen,

ich stehe vor der Aufgabe, einige sehr umfangreiche Verzeichnisse einlesen zu müssen und die gefundenen Dateien in eine Datenbank einzutragen. Dabei geht es um mehrere hunderttausend Dateien, die in unterschiedlich tief gestaffelten Verzeichnissen abgelegt sind. Das Problem ist nun, daß, auch wenn unser Server bereits ein Zeitlimit von zwei Minuten hat, das bei weitem noch nicht reicht.

Neu starten bringt nichts, da mit jedem Start das Programm ja immer wieder von vorne anfängt einzulesen, so daß ich immer wieder nur die selben Dateien einlese, da ich ja auch mit der Datenbank abgleichen muß.

Hat jemand vielleicht eine Idee, wie ich Schritt für Schritt die Verzeichnisse einlesen kann?

Danke schon mal im Voraus,
Sprint
 

goto;

Erfahrenes Mitglied
#2
Hey Sprint,
Zeitlimit? Regelst du das über http?
Was spricht gegen einen cli-Task?

Wie dem auch sei - DB-Queries sind teuer; um Zeit zu sparen, würde ich über ein Reihe von Dateien iterieren, das Ergebnis in einem Array vorhalten und dann die Ergebnisse per transaction in die Datenbank schreiben. Handelt es sich hier bei um einen wiederkehrenden Task, oder soll das nur einmalig erfolgen?
 

Sprint

Erfahrenes Mitglied
#3
Das Zeitlimit ist so für uns eingerichtet. Das ist unser eigener Server, auf den ich aber keinen direkten Zugriff habe. Ist aber auch gut so, weil ich davon überhaupt keine Ahnung habe.

Das mit dem Array hab ich auch schon probiert. Ich muß aber dann bei ca. 110 Sekunden aufhören, um genügend Zeit für die Datenbank zu haben. Und das reicht wie gesagt bei weitem nicht. Und wenn ich das Script wieder starte, fängt es ja doch wieder von vorne an zu lesen, da ich nicht wüßte, wie ich z.B. 20000 Dateien überspringen könnte. Und mit dem Lesen der zu überspringenden Dateien komme ich wieder an die Grenze, so daß ich nie wirklich weiter komme.

Das ganze ist eine einmalige Sache. Das Script muß nur mal die verschiedenen Verzeichnisse durchforsten und alle Dateien einlesen. Die weitere Verarbeitung kommt später und die ist auch schon fertig. Eine quick-and-dirty Lösung wäre schon ausreichend.
 

Sempervivum

Erfahrenes Mitglied
#4
wenn ich das Script wieder starte, fängt es ja doch wieder von vorne an zu lesen, da ich nicht wüßte, wie ich z.B. 20000 Dateien überspringen könnte.
Die Position, wo Du aufgehört hast, speichern und beim nächsten Start dort weiter machen? Habe ich in einer ähnlichen Situation erfolgreich so praktiziert. Ich habe ein wenig getestet mit dem Ergebnis, dass das Lesen aus dem Filesystem wahrscheinlich das kleinere Problem ist: Weniger als 10 sec für ca. 100000 Dateien von Festplatte.
 

Technipion

Erfahrenes Mitglied
#5
An der Stelle wäre es hilfreich wenn du genauer erklärst, was für Dateien du da einliest und wie du sie auswertest (Code). Höchstwahrscheinlich lässt sich dieser Prozess noch optimieren, dann klappt's auch in unter 2 min.
Denn eigentlich können heutige Rechner in 2 Minuten schon brutal viele Daten verarbeiten...

Gruß Technipion
 

goto;

Erfahrenes Mitglied
#6
Ich bin mir gerade nicht sicher ob das bei Dir überhaupt funktioniert, aber einen Ansatz um dein Timeout Problem zu lösen habe ich noch.

Du könntest mit der php-function shell_exec ein "find -f" auf den entsprechenden Ordner machen. Vorteil: "find" baut meta-Daten auf, wodurch ein wiederholter auf bereits indexierte Daten deutlich schneller geht. Das Ergebnis kannst du dann in einer List speichert (step1). Beim wiederholten Aufruf prüfst du dann, ob das file existiert, wenn es existiert iterierst du über die einzelnen Zeilen und ziehst dir deine Informationen raus. Diese kannst du dann via transaction in die Datenbank schreiben und aus der Liste entfernen. Solltest du hier wieder in einen Timeout laufen, kannst du zumindestens sicherstellen, dass du die Daten nicht doppelt in der Datenbank hast und du nicht bei jedem Aufruf von vorn beginnst.
 

Sprint

Erfahrenes Mitglied
#7
Vielen Dank an alle für eure Tips. Im Endeffekt war es der Hinweis von Sempervivum, der mich auf die richtige Spur gebracht hat. Ich hatte bisher immer Dateiname lesen und in DB schreiben abwechselnd durchgeführt. Und das braucht wirklich uferlos viel Zeit. Das reine Auslesen der Dateien in ein Array incl. Bereinigen usw. dagegen braucht nicht mal eine Minute. Über Session läßt sich das dann ganz bequem auch über mehrere Durchgänge abarbeiten.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…