2017-11-16 5 views
0

Ich hatte eine riesige Menge an Daten, über 50*50*10000 Dateien mit der gesamten Dateigröße 3TB. Die Dateistruktur wie folgt aussieht:schneller Weg, um Dateien in Millionen von Dateien zu finden

/myhdd/Experiment_{id}/Run_{id}/Filename

nun einen Dateinamen gegeben, ich suchen möchten, wo es ist; aber eine einfache find /myhdd -name "filename" ist sehr ineffizient. Es muss die gesamte Festplatte nachschlagen, um eine Datei zu finden. Gibt es einen besseren Weg, dies zu tun, wie zum Beispiel einen Index meiner Dateistruktur zu erstellen, um zu beschleunigen find?

+0

Das sind 25 Millionen, keine Milliarden. Machen Sie einen Perl-Hash oder eine einfache Liste und 'grep' darin, damit Sie nicht alle Inodes lesen müssen. –

+0

Ja, wenn Sie alle Dateinamen in eine Datei ablegen (find.> Filenames.txt), dann haben Sie eine nicht mehr als 1 GiB große Textdatei, in der Sie nach Namen grepen können. Kann es auch sortieren und dann 'sgrep' darauf verwenden (die Felder neu anordnen müssen, um den Dateinamen vorne zu haben). Oder komprimiere die unsortierte Version und suche darin mit 'zgrep'. – Velkan

Antwort

0

Vielleicht können Sie locate Befehl verwenden, es funktioniert in der Regel schneller als finden:

locate -b filename

0

Wenn locate oder verschiedene find Anrufe für Ihren Fall noch langsam sind, können Sie eine Datei für die Suche mit erstellen und verwenden die Wege, wie bereits kommentiert.

Sie erstellen, dass „Index“ mit

find . -type f > myindex 

Datei und Sie können sie in regelmäßigen Abständen aktualisiert werden entweder -ctime mit neuen Dateien anzuhängen oder von Anfang an, es muss nur die Zeit, Kosten jetzt Ihrer Suche.

Dann können Sie den Pfad nach einem beliebigen Dateinamen suchen. Dies ist wahrscheinlich schnell genug:

fname="myfilename"; awk -F/ -v f="$fname" '$NF==f' myindex 

Here einige weiteren Informationen zu Ihrem Problem im Zusammenhang.

Verwandte Themen