Umieszczanie wielu (10 milionów) plików w jednym folderze

17

Właśnie dodałem funkcję wyszukiwania predykcyjnego (patrz przykład poniżej) do mojej witryny działającej na serwerze Ubuntu. Działa to bezpośrednio z bazy danych. Chcę buforować wynik dla każdego wyszukiwania i użyć go, jeśli istnieje, w przeciwnym razie utwórz go.

Czy byłby jakiś problem ze mną, zapisując potencjalne 10 milionów wyników w osobnych plikach w jednym katalogu? Czy wskazane jest podzielenie ich na foldery?

Przykład:

Kohjah Breese
źródło
5
Lepiej byłoby podzielić. Każde polecenie, które próbuje wyświetlić zawartość tego katalogu, najprawdopodobniej zdecyduje się strzelić.
muru
8
Więc jeśli masz już bazę danych, dlaczego jej nie użyć? Jestem pewien, że DBMS będzie w stanie lepiej obsługiwać miliony rekordów w porównaniu do systemu plików. Jeśli nie możesz się zdecydować na użycie systemu plików, musisz wymyślić schemat podziału za pomocą jakiegoś skrótu, w tym momencie IMHO wygląda na to, że użycie DB będzie mniej pracochłonne.
roadmr
3
Inną opcją buforowania, która lepiej pasowałaby do twojego modelu, może być memcached lub redis. Są to magazyny kluczowych wartości (więc działają jak pojedynczy katalog i można uzyskać dostęp do elementów tylko według nazwy). Redis jest trwały (nie straci danych po ponownym uruchomieniu), ponieważ ascachowany jest dla bardziej tymczasowych elementów.
Stephen Ostermiller
2
Tutaj jest problem z kurczakiem i jajkiem. Twórcy narzędzi nie obsługują katalogów z dużą liczbą plików, ponieważ ludzie tego nie robią. Ludzie nie tworzą katalogów z dużą liczbą plików, ponieważ narzędzia nie obsługują tego dobrze. np. Rozumiem za jednym razem (i uważam, że to nadal prawda), żądanie funkcji utworzenia wersji generatora os.listdirPythona zostało z tego powodu stanowczo odrzucone.
Z własnego doświadczenia widziałem awarię, gdy przeglądam ponad 32 000 plików w jednym katalogu w systemie Linux 2.6. Oczywiście można dostroić się poza ten punkt, ale nie poleciłbym tego. Wystarczy podzielić na kilka warstw podkatalogów, a będzie znacznie lepiej. Osobiście ograniczyłbym to do około 10 000 na katalog, co dałoby 2 warstwy.
Wolph,

Odpowiedzi:

25

Czy wystąpiłby problem ze mną zapisując potencjalnie około 10 milionów wyników w osobnych plikach w jednym katalogu?

Tak. Prawdopodobnie jest więcej powodów, ale mogę je zrzucić z głowy:

  • tune2fsma opcję o nazwie, dir_indexktóra zwykle jest domyślnie włączona (w Ubuntu), która pozwala przechowywać około 100 000 plików w katalogu, zanim zobaczysz spadek wydajności. To nie jest nawet blisko 10-metrowych plików, o których myślisz.

  • extsystemy plików mają ustaloną maksymalną liczbę i-węzłów. Każdy plik i katalog używa 1 i-węzła. Użyj df -ido widoku swoich partycji i i-węzłów za darmo. Po wyczerpaniu i-węzłów nie można tworzyć nowych plików ani folderów.

  • polecenia takie jak rmi lspodczas używania symboli wieloznacznych rozwiń polecenie i skończy się na „zbyt długiej liście argumentów”. Będziesz musiał użyć finddo usunięcia lub listy plików. I findzwykle jest powolny.

Czy wskazane jest podzielenie ich na foldery?

Tak. Z całą pewnością. Zasadniczo nie można nawet przechowywać plików 10m w 1 katalogu.

Korzystałbym z bazy danych. Jeśli chcesz buforować go dla strony internetowej, spójrz na „ solr ” („zapewniające rozproszone indeksowanie, replikację i równoważenie obciążenia zapytania”).

Rinzwind
źródło
8

Skończyło się z tym samym problemem. Uruchom moje własne testy porównawcze, aby dowiedzieć się, czy możesz umieścić wszystko w tym samym folderze w porównaniu z wieloma folderami. Wydaje się, że możesz i to szybciej!

Reper

Ref: https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28

Hartator
źródło
1
Dzięki, to jest bardzo przydatne. Korzystam z tego na stronie i przeprogramowanie tej części tak, aby zawierało struktury katalogów /abc/efg.html, było prawdziwym problemem. W przyszłości wrócę do płaskiego katalogu.
Kohjah Breese,
0

Wyszukiwanie binarne może z łatwością obsłużyć miliony rekordów, więc przeszukiwanie pojedynczego katalogu nie byłoby problemem. Zrobi to bardzo szybko.

Zasadniczo, jeśli używasz systemu 32-bitowego, wyszukiwanie binarne do rekordów 2 Gb jest łatwe i dobre.

Berekely DB, oprogramowanie typu open source, z łatwością pozwoli ci zapisać pełny wynik pod jednym wpisem i ma wbudowane wyszukiwanie.

Ashok Chand Mathur
źródło