Frage

Ein Produkt, das ich an bearbeite sammelt mehrere tausend Lesungen pro Tag und speichert sie als 64k binäre Dateien auf einer NTFS-Partition (Windows XP). Nach einem Jahr in der Produktion gibt es mehr als 300.000 Dateien in einem einzigen Verzeichnis und die Zahl wächst weiter. Dies hat die Eltern / Vorfahren Verzeichnisse aus dem Windows Explorer sehr zeitaufwendig Zugriff.

Ich habe versucht, den Indexdienst ausschalten, aber das machte keinen Unterschied. Ich habe auch in Betracht gezogen den Dateiinhalt in eine Datenbank / zip files / tarballs bewegen, aber es ist von Vorteil für uns die Dateien einzeln zuzugreifen; Grundsätzlich werden die Dateien noch für Forschungszwecke benötigt und die Forscher sind nicht bereit, mit etwas anderem zu beschäftigen.

Gibt es eine Möglichkeit NTFS oder Windows zu optimieren, so dass es mit all diesen kleinen Dateien arbeiten kann?

War es hilfreich?

Lösung

NTFS Leistung verschlechtert sich stark nach 10.000 Dateien in einem Verzeichnis. Was Sie tun, ist eine zusätzliche Ebene in der Verzeichnishierarchie erstellen, wobei jedes Unterverzeichnis mit 10.000 Dateien.

Für das, was es wert ist, das ist der Ansatz, dass die SVN Leute in nahmen Version 1.5 . Sie verwendeten 1000-Dateien als Standardschwelle.

Andere Tipps

NTFS tatsächlich durchführen gut mit vielen mehr als 10.000 Dateien in einem Verzeichnis, so lange, wie Sie es sagen, alternative Dateinamen zu stoppen Erstellung kompatibel mit 16-Bit-Windows-Plattformen. Mit dem Standard-NTFS erstellt automatisch einen ‚8 Punkt 3‘ Dateinamen für jede Datei, die erstellt wird. Dies wird zu einem Problem, wenn viele Dateien in einem Verzeichnis sind, da Windows auf den Dateien im Verzeichnis sieht sicherstellen, dass der Name, der sie zu schaffen sind, ist nicht bereits im Einsatz. Sie können in dem HKEY_LOCAL_MACHINE \ System gefunden wird \ CurrentControlSet \ Control \ Filesystem Registrierungspfad ‚8 Punkt 3‘ Benennung deaktivieren, indem Sie den NtfsDisable8dot3NameCreation Registrierungswert auf 1. Der Wert. Es ist sicher, diese Änderung zu machen, wie ‚8 Punkt 3‘ name-Dateien nur durch Programme für sehr alte Versionen von Windows geschrieben erforderlich sind.

ist ein Neustart vor dieser Einstellung erforderlich wird wirksam.

Das Performance-Problem wird durch die riesige Menge von Dateien in einem einzigen Verzeichnis verursacht werden: Sobald Sie beseitigen, dass, sollten Sie in Ordnung sein. Dies ist kein NTFS-spezifisches Problem. In der Tat, es ist häufig im Zusammenhang mit Benutzer-Home / Mail-Dateien auf großen UNIX-Systemen angetroffen

Eine offensichtliche Möglichkeit, dieses Problem zu lösen, bewegt sich die Dateien in Ordner mit einem Namen auf den Dateinamen basiert. Unter der Annahme, alle Ihre Dateien haben die Dateinamen von ähnlicher Länge, z.B. ABCDEFGHI.db, ABCEFGHIJ.db, etc, eine Verzeichnisstruktur wie folgt erstellen:

ABC\
    DEF\
        ABCDEFGHI.db
    EFG\
        ABCEFGHIJ.db

diese Struktur verwenden, können Sie schnell eine Datei basierend auf seinen Namen lokalisieren. Wenn die Dateinamen variable Längen haben, eine maximale Länge auswählen und prepend Nullen (oder andere Zeichen), um in das Verzeichnis die Datei gehört zu bestimmen.

Ich habe von einer Aufteilung der Dateien bis zu einer verschachtelten Hierarchie von Verzeichnissen in der Vergangenheit enorme Verbesserungen gesehen, beispielsweise durch ersten dann zweiten Brief von Dateinamen; dann hat jedes Verzeichnis nicht eine übermäßige Anzahl von Dateien zu enthalten. die gesamte Datenbank Manipulieren ist immer noch langsam, aber.

Sie könnten versuchen, so etwas wie Solid File System.

Das gibt Ihnen ein virtuelles Dateisystem, die Anwendungen bereitstellen können, als ob es eine physische Festplatte war. Ihre Anwendung sieht viele kleine Dateien, aber nur eine Datei befindet sich auf Ihrer Festplatte.

http://www.eldos.com/solfsdrv/

Wenn Sie Namen von Dateien berechnen können, können Sie in der Lage sein, sie in Ordner nach Datum zu sortieren, so dass jeder Ordner nur Dateien für einen bestimmten Zeitpunkt hat. Vielleicht möchten Sie auch Monat und Jahr Hierarchien erstellen.

Auch könnten Sie bewegen Dateien, die älter als sagen, ein Jahr, zu einem anderen (aber immer noch erreichbar) Standort?

Schließlich, und auch dies erfordert, dass Sie die Lage sein, Namen zu berechnen, werden Sie feststellen, dass direkt Zugriff auf eine Datei ist viel schneller als zu versuchen, es über den Explorer zu öffnen. Zum Beispiel, sagen
notepad.exe "P: \ ath \ Ihre \ filen.ame auf \"
von der Kommandozeile eigentlich ziemlich schnell sein sollte, vorausgesetzt, Sie den Pfad der Datei, die Sie müssen wissen, ohne eine Verzeichnisliste erhalten hat.

Ein üblicher Trick ist, einfach eine Handvoll Verzeichnisse zu erstellen und die Dateien aufteilen.

Zum Beispiel Doxygen, ein automatisiertes Code-Dokumentation Programm, die Tonnen von HTML-Seiten produzieren kann, hat eine Option für eine zweistufigen tiefe Verzeichnishierarchie zu schaffen. Die Dateien werden dann über den unteren Verzeichnisse verteilt sind.

Hunderttausende von Dateien in einem einzigen Verzeichnis zu haben wird in der Tat NTFS lahmlegen, und es gibt nicht wirklich viel Sie dagegen tun können. Sie sollten überdenken, um die Daten in einem praktischeren Format speichern, wie eine große Tarball oder in einer Datenbank.

Wenn Sie wirklich eine separate Datei für jeden Messwert benötigen, sollten Sie sie in mehrere Unterverzeichnisse sortieren, anstatt sie alle im gleichen Verzeichnis hat. Sie können dies tun, indem Sie eine Hierarchie von Verzeichnissen erstellen und die Dateien in unterschiedlichen auf den Dateinamen abhängig setzen. Auf diese Weise können Sie immer noch speichern und die Dateien nur die Dateinamen zu wissen, laden.

Die Methode, die wir verwenden, ist es, die letzten Buchstaben des Dateinamens zu nehmen, Wende- sie, und ein Brief Verzeichnisse von der Erstellung. Betrachten Sie die folgenden Dateien zum Beispiel:

1.xml
24.xml
12331.xml
2304252.xml

Sie können sie in Verzeichnisse sortieren etwa so:

data/1.xml
data/24.xml
data/1/3/3/12331.xml
data/2/5/2/4/0/2304252.xml

Diese Regelung stellt sicher, dass Sie nie in jedem Verzeichnis mehr als 100 Dateien haben.

Ich habe in dieses Problem viele Male in der Vergangenheit laufen. Wir haben versucht, nach Datum zu speichern, Dateien unter dem Datum zippen, damit Sie nicht viele kleine Dateien, usw. Alle von ihnen waren Leukoplast auf das eigentliche Problem der die Daten als viele kleine Dateien auf NTFS-Speicherung.

Sie können ZFS oder ein anderes Dateisystem gehen, die besser kleine Dateien verarbeitet, aber halt noch und fragen, ob Sie die kleinen Dateien speichern müssen.

In unserem Fall haben wir schließlich auf ein System gingen, waren alle kleinen Dateien für einen bestimmten Zeitpunkt in einem TAR Art der Art und Weise mit einfachen Trennzeichen angehängt, sie zu analysieren. Die Plattendateien ging von 1,2 Millionen auf unter ein paar Tausend. Sie luden tatsächlich schneller, weil NTFS kann nicht die kleinen Dateien verarbeiten sehr gut, und die Fahrt war besser in der Lage ohnehin eine 1MB Datei zwischenzuspeichern. In unserem Fall ist der Zugriff und analysieren Zeit der rechte Teil der Datei im Vergleich zum tatsächlichen Lagerung und Pflege der gespeicherten Dateien minimal zu finden war.

Neben den Dateien platzieren Unterverzeichnisse ..

Persönlich würde ich eine Anwendung entwickeln, die die Schnittstelle hält das selber Ordner, dh alle Dateien als einzelne Dateien angezeigt werden. Dann in der Anwendung Hintergrund nimmt tatsächlich diese Dateien und sie in eine größere Dateien kombinieren (und da die Größen sind immer 64k bekommen die Daten, die Sie benötigen, sollten relativ einfach sein), um das Chaos Sie haben loswerden.

So können Sie noch machen es ihnen leicht auf die Dateien zugreifen sie wollen, aber können Sie auch mehr Kontrolle haben, wie alles aufgebaut ist.

Betrachten Sie sie auf einem anderen Server drängt, dass ein Dateisystem freundlicher zu massiven Mengen kleiner Dateien verwendet (Solaris w / ZFS zum Beispiel)?

Wenn es irgendwelche sinnvoll, kategorisch, Aspekte der Daten könnten Sie nisten sie in einem Verzeichnisbaum. Ich glaube, dass die Verlangsamung die Anzahl der Dateien in einem Verzeichnis fällig ist, nicht die schiere Anzahl der Dateien selbst.

Die naheliegendste, allgemeine Gruppierung ist nach Datum, und gibt Ihnen einen dreistufigen Verschachtelung (Jahr, Monat, Tag) mit einer relativ sicheren Schranke für die Anzahl der Dateien in jedem Blatt Verzeichnis (1-3k).

Auch wenn Sie in der Lage sind, das Dateisystem / Dateibrowser die Leistung zu verbessern, es klingt wie dies ein Problem ist, laufen Sie in weitere 2 Jahre in oder 3 Jahre ... nur in einer Liste suchen von 0.3-1mil Dateien gehe ein Kosten entstehen, so dass es in den langfristigen besser sein kann, Wege zu finden, nur in kleineren Teilmengen der Dateien zu suchen.

Mit Tools wie ‚finden‘ (unter Cygwin oder mingw) kann das Vorhandensein von Unterverzeichnisbaum, ein Nicht-Thema machen, wenn Dateien durchsuchen.

Benennen Sie den Ordner jeden Tag mit einem Zeitstempel.

Wenn die Anwendung der Dateien in c spart. \ Lesungen, dann eine geplante Aufgabe einrichten zu benennen um Mitternacht lesen und erstellen Sie einen neuen leeren Ordner

Dann werden Sie für jeden Tag einen Ordner erhalten, die jeweils mehrere tausend Dateien.

Sie können die Methode erweitern weiter durch Monat zu gruppieren. Zum Beispiel C: \ Lese c werden. \ Archive \ September \ 22

Sie haben mit Ihrem Timing vorsichtig sein, Sie um sicherzustellen, dass der Ordner nicht zu umbenennen versuchen, während das Produkt, um es spart.

Um eine Ordnerstruktur zu erstellen, die auf eine große unbekannte Anzahl von Dateien skaliert, Ich mag das folgende System:

Teilen Sie die Dateinamen in feste Länge Stücke, und dann verschachtelten Ordner erstellen für jedes Stück mit Ausnahme des letzten.

Der Vorteil dieses Systems ist, dass die Tiefe der Ordnerstruktur nur so tief wie die Länge des Dateinamens wächst. Also, wenn Sie Ihre Dateien in einer numerischen Reihenfolge automatisch erzeugt werden, ist die Struktur nur tief ist, ist es sein muss.

12.jpg -> 12.jpg
123.jpg -> 12\123.jpg
123456.jpg -> 12\34\123456.jpg

Dieser Ansatz bedeutet, dass Ordner Dateien und Unterordner enthalten, aber ich denke, es ist ein vernünftigen Kompromiss.

Und hier ist ein schön Powershell Einzeiler um Sie gehen!

$s = '123456'

-join  (( $s -replace '(..)(?!$)', '$1\' -replace '[^\\]*$','' ), $s )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top