Jak radzić sobie z dużą ilością małych plików?

Produkt, nad którym pracuję zbiera kilka tysięcy odczytów dziennie i przechowuje je jako 64K plików binarnych na partycji NTFS (Windows XP). Po roku produkcji w jednym katalogu znajduje się ponad 300000 plików, a ich liczba stale rośnie. To sprawiło, że dostęp do katalogów nadrzędnych/nadrzędnych z Eksploratora windows jest bardzo czasochłonny.

Próbowałem wyłączyć usługę indeksowania, ale to nie miało znaczenia. Rozważałem również przeniesienie zawartości pliku do bazy danych / plików zip / tarballi, ale korzystny jest dla nas dostęp do plików indywidualnie; zasadniczo pliki są nadal potrzebne do celów badawczych, a naukowcy nie chcą zajmować się niczym innym.

Czy istnieje sposób na optymalizację NTFS lub Windows, aby mógł pracować z tymi wszystkimi małymi plikami?

Author: Outlaw Programmer, 2008-09-22

14 answers

Wydajność systemu NTFS znacznie spada po 10 000 plikach w katalogu. To, co robisz, to tworzenie dodatkowego poziomu w hierarchii katalogów, z każdym podkatalogiem zawierającym 10 000 plików.

Jeśli to coś warte, to jest to podejście, które ludzie z SVN przyjęli w wersji 1.5 . Jako domyślny próg wykorzystali 1000 plików.

 25
Author: Adam Tegen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-31 01:18:39

NTFS faktycznie będzie działać dobrze z wieloma więcej niż 10,000 plików w katalogu, o ile powiesz mu, aby przestał tworzyć alternatywne nazwy plików kompatybilne z 16-bitowymi platformami Windows. Domyślnie NTFS automatycznie tworzy nazwę pliku '8 dot 3' dla każdego utworzonego pliku. Staje się to problemem, gdy w katalogu znajduje się wiele plików, ponieważ system Windows patrzy na pliki w katalogu, aby upewnić się, że nazwa, którą tworzą, nie jest już używana. Możesz wyłączyć nazwę "8 dot 3" ustawiając wartość rejestru NtfsDisable8dot3NameCreation na 1. Wartość znajduje się w ścieżce rejestru HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem. Bezpiecznie jest wprowadzić tę zmianę, Ponieważ pliki nazw "8 dot 3" są wymagane tylko przez programy napisane dla bardzo starych wersji systemu Windows.

Ponowne uruchomienie jest wymagane, zanim to ustawienie zacznie obowiązywać.

 28
Author: Dan Finucane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-24 23:06:37

Problem z wydajnością jest spowodowany ogromną ilością plików w jednym katalogu: po wyeliminowaniu tego, powinno być dobrze. Nie jest to problem specyficzny dla systemu NTFS: w rzeczywistości jest on powszechnie spotykany w plikach home/mail użytkownika na dużych systemach uniksowych.

Oczywistym sposobem rozwiązania tego problemu jest przeniesienie plików do folderów o nazwie opartej na nazwie pliku. Zakładając, że wszystkie Twoje pliki mają nazwy plików o podobnej długości, np. ABCDEFGHI.db, ABCEFGHIJ.db, etc, utwórz katalog struktura jak Ta:

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

Używając tej struktury, możesz szybko zlokalizować plik na podstawie jego nazwy. Jeśli nazwy plików mają zmienne długości, wybierz maksymalną długość i poprzedzaj zera (lub dowolny inny znak) w celu określenia katalogu, w którym należy plik.

 8
Author: mdb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 16:33:15

Widziałem wiele ulepszeń w przeszłości od dzielenia plików na zagnieżdżoną hierarchię katalogów, np. pierwszą, a następnie drugą literę nazwy pliku; następnie każdy katalog nie zawiera zbyt dużej liczby plików. Manipulowanie całą bazą danych jest jednak nadal powolne.

 5
Author: moonshadow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 16:27:55

Jeśli możesz obliczyć nazwy plików, możesz sortować je w foldery według daty, tak aby każdy folder miał tylko pliki dla określonej daty. Możesz również utworzyć hierarchię miesięcy i lat.

Możesz też przenieść pliki starsze niż powiedzmy, rok, do innej (ale wciąż dostępnej) lokalizacji?

Wreszcie, i znowu, wymaga to możliwości obliczania nazw, przekonasz się, że bezpośredni dostęp do pliku jest znacznie szybszy niż próba otwarcia go przez explorer. Na przykład, mówiąc
notatnik.exe "P:\ath\to\your\filen.ame "
z wiersza poleceń powinno być dość szybkie, zakładając, że znasz ścieżkę pliku, którego potrzebujesz, bez konieczności uzyskania listy katalogów.

 4
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 17:49:42

Posiadanie setek tysięcy plików w jednym katalogu rzeczywiście sparaliżuje system plików NTFS i niewiele można z tym zrobić. Należy rozważyć przechowywanie danych w bardziej praktycznym formacie, jak jeden duży tarball lub w bazie danych.

Jeśli naprawdę potrzebujesz oddzielnego pliku dla każdego czytania, powinieneś posortować je w kilka podkatalogów zamiast mieć wszystkie z nich w tym samym katalogu. Możesz to zrobić, tworząc hierarchię katalogów i umieszczając pliki w różne w zależności od nazwy pliku. W ten sposób możesz nadal przechowywać i ładować pliki znając tylko nazwę pliku.

Metoda, której używamy, polega na pobraniu kilku ostatnich liter nazwy pliku, odwróceniu ich i utworzeniu z nich jednoliterowych katalogów. Rozważ na przykład następujące pliki:

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

Można je posortować do katalogów w następujący sposób:

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

Ten schemat zapewni, że nigdy nie będziesz miał więcej niż 100 plików w każdym katalogu.

 3
Author: finalman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 16:41:30

Jedną z powszechnych sztuczek jest po prostu tworzenie garstki podkatalogów i dzielenie plików.

Na przykład, Doxygen, zautomatyzowany program do dokumentacji kodu, który może produkować Tony stron html, ma opcję tworzenia dwupoziomowej głębokiej hierarchii katalogów. Pliki są następnie równomiernie rozmieszczone w dolnych katalogach.

 2
Author: nsanders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 16:29:06

Oprócz umieszczania plików w podkatalogach..

Osobiście chciałbym opracować aplikację, która utrzymuje interfejs do tego folderu tak samo, tzn. wszystkie pliki są wyświetlane jako pojedyncze pliki. Następnie w tle aplikacji faktycznie bierze te pliki i połączyć je w większe pliki (a ponieważ rozmiary są zawsze 64K uzyskanie danych, których potrzebujesz, powinno być stosunkowo łatwe), aby pozbyć się bałaganu, który masz.

Więc możesz jeszcze ułatwić im dostęp do pliki, które chcą, ale także pozwala mieć większą kontrolę nad tym, jak wszystko jest zorganizowane.

 2
Author: Redbaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 16:30:49

Możesz spróbować użyć czegoś takiego jak Solid File System.

Daje to wirtualny system plików, który aplikacje mogą montować tak, jakby był fizycznym dyskiem. Aplikacja widzi wiele małych plików, ale tylko jeden plik znajduje się na dysku twardym.

Http://www.eldos.com/solfsdrv/

 2
Author: Ged Byrne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 16:31:47

Napotkałem ten problem wiele razy w przeszłości. Próbowaliśmy przechowywać według daty, zapinając pliki Poniżej daty, więc nie masz wielu małych plików itp. Wszystkie z nich były opatrunkami dla prawdziwego problemu przechowywania danych w postaci wielu małych plików na NTFS.

Możesz przejść do ZFS lub innego systemu plików, który lepiej obsługuje małe pliki, ale i tak zatrzymaj się i zapytaj, czy musisz przechowywać małe pliki.

W naszym przypadku ostatecznie udaliśmy się do systemu były wszystkie małe pliki dla pewna data została dodana w sposób TAR z prostymi ogranicznikami do ich analizy. Pliki na dysku wzrosły z 1,2 miliona do niecałych kilku tysięcy. Faktycznie ładowali się szybciej, ponieważ NTFS nie radzi sobie z małymi plikami bardzo dobrze, a dysk i tak lepiej mógł buforować plik 1MB. W naszym przypadku czas dostępu i parse, aby znaleźć właściwą część pliku był minimalny w porównaniu do rzeczywistego przechowywania i konserwacji przechowywanych plików.

 2
Author: Jason Short,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 16:44:23

Jeśli istnieją jakieś znaczące, kategoryczne aspekty danych, możesz umieścić je w drzewie katalogów. Uważam, że spowolnienie wynika z liczby plików w jednym katalogu, a nie samej liczby plików.

Najbardziej oczywiste, ogólne grupowanie jest według daty i daje trzypoziomową strukturę zagnieżdżania (Rok, Miesiąc, Dzień) ze stosunkowo bezpiecznym powiązaniem liczby plików w każdym katalogu liściowym (1-3K).

Nawet jeśli jesteś w stanie poprawić system plików/plik wydajność przeglądarki, brzmi to tak, że jest to problem, na który napotkasz za kolejne 2 lata lub 3 lata... samo patrzenie na listę plików 0.3-1mil będzie kosztować, więc może być lepiej w dłuższej perspektywie znaleźć sposoby, aby spojrzeć tylko na mniejsze podzbiory plików.

Używanie narzędzi takich jak' find ' (pod cygwin lub MinGW) może sprawić, że obecność drzewa podkatalogów nie będzie problemem podczas przeglądania plików.

 1
Author: rcreswick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 16:31:50

Zmieniaj nazwę folderu każdego dnia za pomocą znacznika czasu.

Jeśli aplikacja zapisuje pliki do c:\Readings następnie skonfiguruj zaplanowane zadanie, aby zmienić nazwę odczytu o północy i utworzyć nowy pusty folder.

Wtedy otrzymasz jeden folder na każdy dzień, każdy zawierający kilka tysięcy plików.

Możesz rozszerzyć metodę o grupę według miesiąca. Na przykład, C:\Reading zostań c:\Archive\September\22.

Musisz uważać na swój czas, aby upewnić się, że nie jesteś próbuje zmienić nazwę folderu podczas zapisywania produktu.

 1
Author: Ged Byrne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 16:37:09

Rozważ przepchnięcie ich na inny serwer, który używa systemu plików przyjazniejszego dla ogromnych ilości małych plików (np. Solaris w/ZFS)?

 0
Author: Brian Knoblauch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 16:27:40

Aby utworzyć strukturę folderów, które będą skalowane do dużej nieznanej liczby plików, podoba mi się następujący system:

Podziel nazwę pliku na kawałki o stałej długości, a następnie utwórz zagnieżdżone foldery dla każdego kawałka z wyjątkiem ostatniego.

Zaletą tego systemu jest to, że głębokość struktury folderów rośnie tylko tak głęboko, jak długość nazwy pliku. Więc jeśli pliki są automatycznie generowane w sekwencji numerycznej, struktura jest tylko głęboka, to musi be.

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

To podejście oznacza, że foldery zawierają pliki i podfoldery, ale myślę, że jest to rozsądny kompromis.

A oto piękny PowerShell one-liner, który cię podniesie!
$s = '123456'

-join  (( $s -replace '(..)(?!$)', '$1\' -replace '[^\\]*$','' ), $s )
 0
Author: John Rees,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-23 22:14:11