Follow

Ich suche einen effizienten (schnellen) Weg, Dateien in einer Verzeichnisstruktur zu zählen. Viele Dateien. Sehr viele Dateien. Mehrere 100k pro Ordner. Schätzungsweise mehrere Millionen insgesamt. Ideen?

Bonuspunkte: Das ganze liegt remote in ner Hetzner Storage Box.

Ok, "mehrere Millionen" war vielleicht ein bisschen untertrieben? Das hier war nur ein Subset davon ...

$ time fdfind -e jpg | wc -l
44207382
fdfind -e jpg 107.09s user 106.58s system 4% cpu 1:21:26.05 total
wc -l 15.10s user 32.92s system 0% cpu 1:21:26.05 total

// cc @schenklklopfer @eri @l3viathan

@psy

Ich mach da "find $FOLDER | wc -l"

Oder wenns wirklich nur Dateien zählen soll "find -type f $FOLDER | wc -l"

Wie schnell das Remote ist keine Ahnung.

@schenklklopfer Find ist bei der Menge Dateien leider auch schon extremst langsam, selbst wenn ich es nur auf einem Subset davon lokal laufen lasse.

@l3viathan Wenn ich das richtig verstehe zieht es den Geschwindigkeitsvorteil hauptsächlich aus dem Name-Matching, richtig? Das würde mir nicht viel bringen,w eil ich überhaupt nicht auf Namen matche :D

@psy Bei mir im Homeverzeichnis:
fd > /dev/null 2.88s user 4.89s system 378% cpu 2.053 total
find . > /dev/null 1.33s user 22.59s system 60% cpu 39.377 total

@l3viathan Bei wie vielen Dateien? Ich hab hier wie gesagt zwischen 100k und 3m files pro verzeichnis und davon ~50 verzeichnisse.

@psy rund 241k Dateien. Gerade bei vielen Dateien sollte es einen großen Impact haben; nutzt halt nicht nur eine CPU.

@l3viathan @psy
Bei solchen Vergleichen sollte man aufpassen. Wenn irgend ein Tool das Betriebssystem dazu bringt die file table in den Ram zu laden ist jeder weiterer Zugriff auf die selben Bereiche des Dateisystems ab da an merklich beschleunigt. Ohne Warmup ist damit der Erstlauf immer massiv benachteiligt, selbst auf einer SSD

@gom Ich habe fd nach find aufgeufen, d.h. der Vergleich geht dann eher zu Lasten von fd.

@l3viathan Entweder hast du ein Formulierungsdreher oder die Aussage ist falsch :)

@gom Falsch formuliert. (Tatsächlich war es fd, time find, time fd).

@psy OK, völlig panne, aber weißt du, ob die Storagebox inodes sequentiell vergibt? Wenn ja einfach noch ne Datei anlegen und schauen welchen inode die kriegt?^^

@cherti Ich mag die Art wie du denkst! :)

Muss ich mir später mal genauer anschauen.

@psy @cherti mit welchen Protokollen kann auf so eine Storage Box zugegriffen werden?

@psy Alle untertützten Protokolle klingen schmerzhaft. Nur CIFS kenne ich nicht so gut. Aber der Rest ist halt auf Übertragung einzelner Dateien optimiert. :-(

Meine Herangehensweise wäre eine hetzner cloud Instanz zu mieten, die Storage Box dort per sshfs einbinden und dann per Kommandozeilenprogrammen (ich würde ncdu nutzen) darauf zugreifen.
Wenn die Protokolle nicht gut werden können, dann wenigstens Latenz & Bandbreite versuchen zu verbessern.

Auch wenn ich @psy wahrscheinlich keine neuen Informationen bringe, schreibe ich hier noch ein paar Gedanken nieder.
* docs.hetzner.com/de/robot/stor sagt, dass zfs genutzt wird
* docs.hetzner.com/de/robot/stor sagt, wie Kommandozeilenbefehle direkt auf der StorageBox ausgeführt werden können
* docs.hetzner.com/de/robot/stor sagt, dass SMB/CIFS besser ist, da block-orientiert

@psy @txt_file also sponater test zuhause: über CIFS krieg ich (über df -i) keine inodes, über sshfs krieg ich Inode-Zahlen, also sshfs scheint die rauszulegen (und soweit ich das sehe stimmen die auch). sshfs benutzt im Hintergrund *glaube ich* SFTP, vielleicht kriegt man da irgendwie inode-Werte rausgepopelt...

@psy @txt_file HA! "sftp mydestination:" dropt dich in 'ne interaktive sftp-session, wo du "df -i" machen kannst. siehe man sftp for details.

Jetzt weiß ich allerdings nicht ob die Inode-Zahlen, die du da kriegst, in deinem Fall akkurat sind, weil ich nicht weiß, wie Hetzner das Storage-Backend gebaut hat. Aber wenn du da dein eigenes LVM-Volume/Filesystem/Btrfs-subvolume/ZFS-Pool/Bierkasten/Karottenbrot/Parkhaus hast, könnte das funktionieren.

@psy @txt_file
Manpage sagt auch, für den interactive mode loggt sich sftp im Ziel ein, jetzt ist noch die Frage ob Hetzner interactive mode unterbunden hat, weil sie keine Logins in ihr storage system haben wollen.

A number of "if"s to doublecheck, but maybe you are lucky.^^

@psy
rsync -av --list-only user@domain.de:/path/ /dummypath/ | wc -l

Zähle alle Ordner und Dateien, wenn nur Dateien gewünsch sind müsste noch ein "grep" dazu welches Zeilen selektiert für die "^-" gilt. Was für Geschwindigkeit sorgt ist vor allem, dass rsync direkt auf der Quelle läuft und entsprechend nicht mir Netzwerklatenzen zu kämpfen hat.

@gom Da die Ordner in der Unterzahl sind (nicht mehr als 100) verfälscht das das Ergebnis nicht wirklich :D

Sign in to participate in the conversation
Mastodon

The social network of the future: No ads, no corporate surveillance, ethical design, and decentralization! Own your data with Mastodon!