Mam aplikację piszącą do katalogu ext3, który z czasem urósł do około trzech milionów plików. Nie trzeba dodawać, że czytanie listy plików tego katalogu jest nieznośnie wolne.
Nie obwiniam ext3. Właściwym rozwiązaniem byłoby pozwolenie kodowi aplikacji zapisywać w podkatalogach, na przykład ./a/b/c/abc.ext
zamiast używać tylko ./abc.ext
.
Zmieniam się na taką strukturę podkatalogów, a moje pytanie brzmi: z grubsza, ile plików powinienem przechowywać w jednym katalogu ext3, a jednocześnie uzyskać akceptowalną wydajność? Jakie masz wrażenia
Lub innymi słowy; zakładając, że muszę przechowywać trzy miliony plików w strukturze, ile głębokości powinna ./a/b/c/abc.ext
mieć struktura?
Oczywiście jest to pytanie, na które nie można dokładnie odpowiedzieć, ale szukam oszacowania parku.
http://en.wikipedia.org/wiki/Ext3#Functionality - wspomina, że katalog może mieć tylko około 32000 podkatalogów, ale nie wspomina o plikach.
http://roopindersingh.com/2008/05/10/ext3-handling-large-number-of-files-in-a-directory/
Nienawidzę także wymiany ekspertów, ale czytam komentarz na to pytanie , że idealnie jest mieć mniej niż 10-15 000 na katalog.
źródło
Potrafię potwierdzić na dość potężnym serwerze z dużą ilością pamięci pod przyzwoitym obciążeniem, że 70 000 plików może spowodować spustoszenie wszelkiego rodzaju. Poszedłem usunąć folder pamięci podręcznej z 70k plików, co spowodowało, że apache zaczął odradzać nowe instancje, dopóki nie osiągnął maksymalnej liczby 255 i system zużył całą wolną pamięć (16 GB, chociaż instancja wirtualna mogła być niższa). Tak czy inaczej, utrzymanie go poniżej 25 000 jest prawdopodobnie bardzo ostrożnym posunięciem
źródło
Z mojego doświadczenia wynika, że najlepszym podejściem jest nie przeprojektowywanie struktury plików z góry. Jak wspomniano w co najmniej jednej innej odpowiedzi, istnieją rozszerzenia systemu plików, które zajmują się kwestiami związanymi z wydajnością.
Problem, który częściej dotykam, to użyteczność po stronie administracyjnej. Najmniejszą pracą, jaką możesz zrobić, aby zmniejszyć liczbę plików w katalogu, jest prawdopodobnie podejście, którego potrzebujesz teraz.
sqrt (3_000_000) == 1732
Kilka tysięcy plików w jednym katalogu brzmi dla mnie rozsądnie. Bądź swoim własnym sędzią dla swojej sytuacji. Aby to osiągnąć, spróbuj podzielić pliki na jeden poziom katalogów skrótów, aby średnia liczba plików w katalogu była mniej więcej taka sama jak liczba katalogów.
Biorąc pod uwagę Twój przykład byłoby
./a/abc.ext
,./ab/abc.ext
,./abc/abc.ext
, ....Rozpowszechnianie plików będzie w dużym stopniu zależeć od rzeczywistych nazw plików. Wyobraź sobie zastosowanie tej techniki do katalogu milionów plików o nazwach
foobar???.txt
. Istnieją sposoby na osiągnięcie bardziej równomiernego rozprzestrzeniania się, na przykład haszowanie oparte na wartości określonej liczby bitów z sumy MD5 każdej nazwy pliku, ale śmiem zgadywać, że byłoby to przesadą w stosunku do tego, co próbujesz osiągnąć.źródło
Hmm, ostatnio czytałem ten artykuł . Zasadniczo korzystasz z dystrybucji swojego ulubionego algorytmu mieszającego. Zacząłem grać z liczbami, INT z MySQL ma maksymalną wartość 2147483647. Możesz także zmieniać żądaną liczbę plików na katalog i liczbę podkatalogów, aby ustalić ostateczną liczbę podkatalogów / plików- podział na katalog dla danego zestawu danych, ale trudno jest znaleźć dowody empiryczne na temat optymalnych organizacji katalogów / plików. W tym artykule przedstawiono wgląd w różnice w wydajności między systemami plików (kilka interesujących wskaźników), ale nic o optymalnych organizacjach.
źródło
Myślę, że zbyt dużo się nad tym zastanawiasz. Jeśli nawet wybrałeś jeden dodatkowy poziom katalogów i potrafiłeś zrównoważyć wszystko, miałbyś 1732 * katalogów i 1732 plików na katalog.
O ile nie planujesz potrzebować dziesiątek miliardów plików, możesz właściwie wybrać liczbę od 1000 do 100 000 i uzyskać dobre wyniki.
* pierwiastek kwadratowy z 3 milionów.
źródło