Розміщення багатьох (10 мільйонів) файлів в одній папці


17

Щойно я додав функцію прогностичного пошуку (див. Приклад нижче) на свій сайт, який працює на сервері Ubuntu. Це працює безпосередньо з бази даних. Я хочу кешувати результат для кожного пошуку та використовувати його, якщо він існує, створити його.

Чи буде якась проблема зі мною збереження потенційних 10-мільйонних результатів в окремих файлах в одному каталозі? Або доцільно розділити їх на папки?

Приклад:


5
Було б краще розділитись. Будь-яка команда, яка намагається перерахувати вміст цього каталогу, швидше за все, вирішить самостійно знімати.
муру

8
Тож якщо у вас вже є база даних, чому б не використовувати її? Я впевнений, що СУБД зможе краще обробляти мільйони записів проти файлової системи. Якщо ви готові використовувати файлову систему, вам потрібно придумати схему розбиття за допомогою якогось хеша, в цьому моменті IMHO звучить, як використання БД буде менше працювати.
roadmr

3
Ще одним варіантом кешування, який би краще відповідав вашій моделі, може бути певний або перероблений. Вони є ключовими сховищами цінності (тому вони діють як один каталог, і ви отримуєте доступ до елементів просто за назвою). Redis є стійким (не втратить дані при його перезапуску) там, де запам'ятовується для більш тимчасових предметів.
Стівен Остерміллер

2
Тут є проблема з куркою і яйцями. Розробники інструментів не обробляють каталоги з великою кількістю файлів, оскільки люди цього не роблять. І люди не роблять каталогів з великою кількістю файлів, оскільки інструменти не підтримують її добре. Наприклад, я зрозумів свого часу (і я вважаю, що це все-таки так), запит на особливості зробити генераторну версію os.listdirв python з цієї причини було категорично відхилено.

З власного досвіду я бачив поломку при переході 32k файлів в одному каталозі на Linux 2.6. Можна, звичайно, налаштовуватися за цією точкою, але я б не рекомендував це. Просто розділіть на кілька шарів підкаталогів, і це буде набагато краще. Особисто я обмежую його приблизно 10 000 за каталог, який дасть вам 2 шари.
Вольф

Відповіді:


25

Чи буде якась проблема зі мною збереження потенційних приблизно 10 мільйонів результатів в окремих файлах в одному каталозі?

Так. Напевно, є більше причин, але це я можу відкласти вгорі голови:

  • tune2fsє опція, яка називається, dir_indexщо, як правило, включається за замовчуванням (для Ubuntu це), що дозволяє зберігати приблизно 100 К файлів у каталозі, перш ніж побачити хіт продуктивності. Це навіть не близько 10м файлів, про які ви думаєте.

  • extфайлові системи мають фіксовану максимальну кількість входів. У кожному файлі та каталозі використовується 1 inode. Використовуйте df -iдля перегляду ваших розділів та індексів безкоштовно. Коли у вас не вистачає inode, ви не можете створювати нові файли чи папки.

  • такі команди, як rmі lsпри використанні підстановних знаків, розширюють команду, і в кінцевому підсумку буде "список аргументів занадто довгий". Вам доведеться використовувати findдля видалення або списку файлів. І, findяк правило, повільно.

Або доцільно розділити їх на папки?

Так. Найбільш точно. В основному ви навіть не можете зберігати 10м файли в 1 каталозі.

Я б використовував базу даних. Якщо ви хочете кешувати його на веб-сайті, перегляньте " solr " ("надання розподіленої індексації, реплікації та збалансованого запиту запитів").


8

Закінчився тим самим номером. Запустіть власні орієнтири, щоб дізнатися, чи можна розміщувати все в одній папці порівняно з наявністю кількох папок. Здається, ви можете, і це швидше!

Орієнтир

Посилання: https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28


1
Дякую, це дуже корисно. Я використовую це на сайті, і було реальною проблемою перепрограмувати цю частину, щоб мати /abc/efg.html структури каталогів. Тож я в майбутньому повернусь до плоского каталогу.
Kohjah Breese

0

Двійковий пошук може легко обробляти мільйони записів, тому пошук по одному каталогу не буде проблемою. Це зробиться дуже швидко.

В основному, якщо ви використовуєте 32-бітну систему, двійковий пошук до 2Gb записів простий і хороший.

Berekely DB, програмне забезпечення з відкритим кодом, легко дозволить вам зберігати повний результат під одним записом і вбудує пошук.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.