Verzeichnisbaum effizient überwachen?

  • Jaaa.. in der Hoffnung ein paar Leute mit Grips sind grad anwesend, habe ich da mal ne Fraage:

    Und zwar hab ich hier nen Verzeichnisbaum mit potentiell vielen Dateien.
    So, und jetzt gibts da parallel laufende Prozesse, die möglicherweise den Inhalt der Dateien in Unterverzeichnissen verändern.

    Dann gibt es noch den Index, der die wichtigsten Informationen über den Inhalt der Dateien speichert.

    Nur erstellt und wartet sich der Index eben nicht von alleine, sondern der muss bei einer Dateiänderung aktualisiert werden.

    Meine Frage:
    Wie kriege ich eine Dateiänderung in einem Unterverzeichnis am schnellsten mit? Ich muss nicht wissen, was sich verändert hat, sondern nur, ob es sich verändert hat. Dann soll der Index an der entsprechenden Stelle aktualisiert, aber nicht komplett neu erstellt werden.

    Anmerkung:
    Prüfsummen sind viel zu langsam, da ist die Datei-Modifikationszeit schneller eingelesen als eine Prüfsumme erstellt.
    Meine momentane Idee ist es, die Modifikationszeit (Auflösung von 1sec reicht) im Index zu speichern, und dann den ganzen Baum bis in die Unterverzeichnisse runter zu scannen. Aber das dünkt mich etwas uneffizient, drum frag ich.

    Achja, das ganze muss betriebsystem- und dateisystemunabhängig sein, also auf die Dateisystemfunktionen der C-Standardbibliothek beschränkt.

  • würde spontan auch vermuten, dass du rein über die abstrakten schnittstellen nicht umherkommen wirst, die hierarchie zu traversieren
    die spezifischeren details unterscheiden sich wohl von OS zu OS und ggf. sogar von FS zu FS

  • Ja, ne.. an inotify und so hab ich ja selber sofort gedacht. Aber geht eben nicht.

    Auch wenn ich jetzt jeglichen Coolnessfaktor verspiele, das ganze wird in PHP implementiert (und jez komm mir keiner mit irgendwelchen Datenbankenideen), ergo liegen betriebsystemnahe Funktionen nicht drin.

  • oder halt ggf irgendeine abstrakte Schnittstelle einführen, halt z.B. einfach ne datei im wurzelverzeichnis, welche bei jeder operation der laufenden prozesse zusätzlich mal getoucht wird.

  • Zitat von oreissig

    z.B. einfach ne datei im wurzelverzeichnis, welche bei jeder operation der laufenden prozesse zusätzlich mal getoucht wird.


    Ja.. das war bisher das Verhalten.
    Das Problem dabei ist, dass ich nicht feststellen kann, was sich verändert hat, also den ganzen Index aktualisieren musste.

    Am effizientisten wärs vielleicht doch, wenn man nicht den Dateibaum vom Indexer untersucht, sondern dass jede Dateiänderung in einem Log mitschneidet. Und der Index verwertet den dann.

  • Bin gerade drauf und dran, mir das ganze mit iwatch (Tool für inotify) zu machen. Nun ja, eben nicht was du willst.

    Wenn du das ganze Plattformübergreiffen machen willst, kommst du wohl oder übel nicht um eine Indexierung herum wo du halt immer wieder überprüfst ob sich was geändert hat.

  • Betriebsystemabhänige Funktionen will ich nicht benutzen. fam schon gar nicht, das stinkt.
    Es ist mir ein zu grosses Gefrickel, da für jedes potentielle OS ein Interface zu bauen.

    Zitat von chessboi

    Wenn du das ganze Plattformübergreiffen machen willst, kommst du wohl oder übel nicht um eine Indexierung herum wo du halt immer wieder überprüfst ob sich was geändert hat.


    Ja, das ist die Ausgangsidee. :oO:

    Frage ist, wie ich diese Überprüfung am effizientesten mache, und was schnelleres als Zeitstempelvergleich lag da bisher nicht drin.
    Ich werds jetzt mit einem Log machen, wo sich jedes Änderungsaktion eintragen muss.

  • Zitat von gandro


    Ich werds jetzt mit einem Log machen, wo sich jedes Änderungsaktion eintragen muss.



    Nur wie willst du Änderungsaktionen zwingen sich in das Logfile einzutragen, ohne mit dem Filehandler zusammen zu arbeiten (da dies ja Plattformspezifisch wäre) und ohne ein eigenes Dateisystem zu basteln (da dies ein mörderischer Aufwand darstellt)?

  • Zitat von chessboi

    Nur wie willst du Änderungsaktionen zwingen sich in das Logfile einzutragen


    Sämtliche Änderungen an den Dateien werden von mir ausgelöst. Ergo ist das nicht das Problem, den entsprechenden Code umzuschreiben.

    Ich bin das Problem von der falschen Seite angegangen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!