Mam katalog z około 100 000 małych plików (każdy plik jest z 1-3 linii, każdy plik jest plikiem tekstowym). Rozmiar katalogu nie jest bardzo duży (<2 GB). Te dane znajdują się na profesjonalnie administrowanym serwerze NFS. Serwer działa pod Linuksem. Myślę, że systemem plików jest ext3, ale nie jestem tego pewien. Ponadto nie mam dostępu root do serwera.
Te pliki są wynikiem eksperymentu naukowego na dużą skalę, nad którym nie mam kontroli. Muszę jednak przeanalizować wyniki.
Każda operacja / przetwarzanie we / wy w tym katalogu jest bardzo, bardzo wolne. Otwieranie pliku (otwieranie w pythonie), czytanie z otwartego pliku, zamykanie pliku są bardzo wolne. W bash ls, du itp. Nie działają.
Pytanie brzmi:
Jaka jest maksymalna liczba plików w katalogu w systemie Linux w taki sposób, że przetwarzanie, otwieranie, czytanie itp. Jest praktyczne? Rozumiem, że odpowiedź zależy od wielu rzeczy: typu fs, wersji jądra, wersji serwera, sprzętu itp. Chcę tylko, jeśli to możliwe, ogólnej zasady.
źródło
Odpowiedzi:
Jak można się domyślić, zależy to od wielu rzeczy, głównie od typu systemu plików i opcji oraz do pewnego stopnia wersji jądra. W serii ext2 / ext3 / ext4 nastąpiła znaczna poprawa, kiedy
dir_index
pojawiła się opcja (jakiś czas po początkowej wersji ext3): sprawia, że katalogi są przechowywane jako drzewa wyszukiwania (logarytmiczny dostęp do czasu) zamiast list liniowych (liniowy dostęp do czasu ). Nie jest to coś, co można zobaczyć w NFS, ale jeśli masz jakiś kontakt z administratorami, możesz poprosić ich o uruchomienietune2fs -l /dev/something |grep features
(być może nawet przekonać ich do aktualizacji?). Liczy się tylko liczba plików, a nie ich rozmiar.Nawet przy
dir_index
100000 wydaje się duży. Najlepiej uzyskaj autorów programu, który tworzy pliki, aby dodać poziom podkatalogów. Aby nie zmniejszać wydajności, zalecałbym limit około 1000 plików na katalog dla ext2 lub ext3 bezdir_index
i 20000 zdir_index
lub reiserfs. Jeśli nie możesz kontrolować sposobu tworzenia plików, przenieś je do osobnych katalogów, zanim zrobisz cokolwiek innego.źródło