Много маленьких файлов или пара огромных? - PullRequest
4 голосов
/ 27 июня 2009

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

В основном меня интересует производительность чтения Моя файловая система в настоящее время ext3 в Linux (Ubuntu Server Edition, если это имеет значение), хотя я все еще могу переключаться, поэтому сравнение между различными файловыми системами было бы невероятным. По техническим причинам я не могу использовать реальную СУБД для этого (отсюда и вопрос), поэтому «просто используйте MySQL» не является хорошим ответом.

Заранее спасибо, и дайте мне знать, если мне нужно быть более конкретным.


РЕДАКТИРОВАТЬ: Я собираюсь хранить много сравнительно небольших фрагментов данных, поэтому мне было бы проще использовать множество маленьких файлов. Поэтому, если бы я использовал несколько больших файлов, я бы извлекал из них только несколько КБ за раз. Я бы также использовал индекс, так что это не проблема. Кроме того, некоторые данные указывают на другие фрагменты данных (это указывает на файл в случае большого количества маленьких файлов и указывает на местоположение данных в файле в случае больших файлов).

Ответы [ 5 ]

5 голосов
/ 27 июня 2009

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

Допустим, вы ищете строку текста , содержащуюся в текстовом файле. Поиск 1 ТБ файла будет намного быстрее , чем открытие 1 000 000 МБ файлов и поиск по ним.

Каждая операция открытия файла занимает время . Большой файл должен быть открыт только один раз.

И, учитывая производительность диска , вероятность того, что будет храниться в одном файле , скорее всего, чем в большой серии файлов.

... Опять же, это обобщения, не зная больше о вашем конкретном приложении.

Наслаждайтесь

Роберт К. Картейно

3 голосов
/ 27 июня 2009

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

Если вы решите использовать множество файлов, я предлагаю вам структуру, подобную

b/a/bar
b/a/baz
f/o/foo

потому что у вас есть ограничения на количество файлов в каталоге.

3 голосов
/ 27 июня 2009

Основной вопрос TMO - это индексирование. Если вы собираетесь искать информацию в огромном файле без хорошего индекса, вам придется сканировать весь файл на предмет правильной информации, которая может быть длинной. Если вы думаете, что можете создать надежные механизмы индексации, тогда хорошо, вы должны пойти с огромным файлом.

Я бы предпочел делегировать эту задачу на ext3, что должно быть довольно хорошо.

редактировать:

В соответствии с этой статьей википедии о ext3 следует учитывать, что фрагментация со временем происходит. Поэтому, если у вас есть огромное количество маленьких файлов, которые занимают значительный процент файловой системы, вы со временем потеряете производительность.

В статье также подтверждается утверждение о 32 тыс. Файлов на ограничение каталога (при условии, что статья в Википедии может проверять что угодно)

2 голосов
/ 27 июня 2009

Я считаю, что Ext3 имеет ограничение около 32000 файлов / подкаталогов на каталог. Если вы идете по пути миллионов файлов, вам нужно будет распределить их по многим каталогам. Я не знаю, что это могло бы сделать с производительностью.

Я бы предпочел несколько больших файлов. На самом деле, зачем их вообще несколько, если только они не являются чем-то вроде логически отдельных единиц? Если вы все еще разделяете это только ради того, чтобы разделить это, я говорю, не делайте этого. Ext3 прекрасно справляется с очень большими файлами.

1 голос
/ 27 июня 2009

Я работаю с системой, которая хранит до 5 миллионов файлов в файловой системе XFS под Linux и не имеет проблем с производительностью. Мы используем файлы только для хранения данных, мы никогда не сканируем их полностью, у нас есть база данных для поиска, и одно из полей в таблице содержит указатель, который мы используем для извлечения. Мы используем ровно два уровня каталогов, как указано выше, с именами файлов в качестве guid, хотя можно использовать больше, если количество файлов станет еще больше. Мы выбрали этот подход, чтобы избежать хранения в базе данных нескольких лишних терабайт, которые нужно было только хранить / возвращать и никогда не искать, и это хорошо сработало для нас. Наши файлы варьируются от 1 кОм до 500К.

Мы также запустили систему на ext3, и она функционировала нормально, хотя я не уверен, что мы когда-либо выдвинули ее за миллион файлов. Вероятно, нам нужно было бы перейти к системе каталогов 3 из-за ограничений на количество файлов в каталоге.

...