Какие размеры блоков для миллионов маленьких файлов

10

У меня 2x 4 ТБ дисков в аппаратном RAID1 (это может быть LSI MegaRaid) в Debian Wheezy. Размер физического блока составляет 4 КБ. Я собираюсь хранить 150-200 миллионов маленьких файлов (от 3 до 10 КБ). Я не спрашиваю о производительности, но о лучшей файловой системе и размерах блоков для экономии места. Я скопировал файл размером 8200 байт в ext4 с размером блока 4 КБ. Это заняло 32 КБ диска !? Является ли журналирование причиной этого? Итак, какие есть варианты, чтобы сохранить большую часть памяти для таких маленьких файлов?

rabudde
источник

Ответы:

1

Если бы я был в такой ситуации, я бы посмотрел базу данных, которая может хранить все данные в одном файле с компактным индексом на основе смещения, а не в виде отдельных файлов. Может быть, база данных с драйвером FUSE доступна для взаимодействия с ним в виде файлов, когда это необходимо, без того, чтобы все они фактически были отдельными файлами.

В качестве альтернативы вы можете взглянуть на, скажем, 60–70-й процентиль размеров файлов и попытаться приспособить этот размер файла непосредственно к узлам дерева файловой системы, а не как отдельные блоки на диске. Хранение 10 КБ в каждом узле, вероятно, является большой задачей, но если бы вы могли получить 60-70% файлов, это, вероятно, было бы огромным выигрышем.

Только определенные файловые системы могут сделать это вообще (reiserfs - один), и я предполагаю, что все зависит от того, какого размера этот процентиль, будет ли он вписываться в дерево. Вы можете быть в состоянии настроить это. Я думаю, попытаться уместить остальных в один блок.

И не беспокойтесь о журналах; в любом случае они имеют верхний предел размера.


источник
4
Нет, нет, нет, нет, нет, нет, просто ... нет к вашему первому абзацу. Я сделал эту ошибку несколько лет назад, и позже ее пришлось исправить. Я также унаследовал системы, которые используют этот шаблон проектирования. Файлы принадлежат в файловой системе или в качестве компромисса, в объекте FileStream SQL Server, если вы должны объединить их (так что, возможно, ваш драйвер FUSE, но все же просто нет). При работе в файловой системе есть и другие соображения, например, не помещайте 4 миллиона файлов в одну папку (я тоже допустил эту ошибку).
Марк Хендерсон
2
@MarkHenderson, но проблема заключается в определении того, что ДОЛЖНО быть файлом, а что должно быть записью. Без каких-либо дополнительных подробностей сотни миллионов крошечных вещей звучат НАМНОГО больше похожи на записи. То, что он в настоящее время хранит их в виде файлов, не означает, что они должны оставаться такими или должны быть такими. Кроме того, я ни на секунду не предлагал использовать SQL Server для работы;)
2
5 лет назад я унаследовал систему с 1 миллионом файлов в одной папке и около 10 000 новых файлов размером 1-4 КБ каждый день. Я решил бросить их всех в таблицу ISAM, потому что «Эй, они просто текст для анализа!» а потом это оказалось огромной ошибкой, потому что теперь у меня была одна таблица на 12 ГБ со строками из миллиарда строк, которые в большинстве случаев ничего не делали после обработки. Поэтому я вернулся к размещению их в файловой системе с иерархическими папками на основе GUID имени файла.
Марк Хендерсон
(почему проблема с одной таблицей в 12 ГБ со строками-скллионами была другой, и я не буду вдаваться в подробности)
Марк Хендерсон,
2
@MarkHenderson: Это не другая проблема, поэтому вы сказали, что это было неправильное решение («... огромная ошибка, потому что теперь у меня была одна таблица на 12 ГБ со строками из миллиарда строк ...»). Вы выбрали неправильный формат механизма базы данных / таблицы, но концепция помещения множества мелких вещей в один файл с индексом является разумной, если вы делаете это правильно. Что вам нужно, так это база данных, которая выделяется в хранилищах ключей / значений для миллионов небольших объектов с автоматическим разделением. Также обратите внимание, что он специально не заботится о производительности, просто космос.