Как вы справляетесь с множеством маленьких файлов? - PullRequest
26 голосов
/ 22 сентября 2008

Продукт, над которым я работаю, собирает несколько тысяч чтений в день и сохраняет их как двоичные файлы размером 64 КБ в разделе NTFS (Windows XP). После года производства в одном каталоге более 300000 файлов, и их число продолжает расти. Это делает доступ к каталогам родителей / предков из проводника Windows очень трудоемким.

Я пытался отключить службу индексирования, но это не имело значения. Я также планировал перенести содержимое файла в базу данных / zip-файлы / архивы, но для нас было бы полезно получить доступ к файлам индивидуально; в основном, файлы все еще необходимы для исследовательских целей, и исследователи не желают иметь дело с чем-либо еще.

Есть ли способ оптимизировать NTFS или Windows, чтобы он мог работать со всеми этими небольшими файлами?

Ответы [ 14 ]

1 голос
/ 22 сентября 2008

Переименовывайте папку каждый день с отметкой времени.

Если приложение сохраняет файлы в папке c: \ Readings, тогда настройте запланированное задание, чтобы переименовать чтение в полночь и создать новую пустую папку.

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

Вы можете расширить метод для группировки по месяцам. Например, C: \ Reading становится c: \ Archive \ September \ 22.

Вы должны быть осторожны со временем, чтобы убедиться, что вы не пытаетесь переименовать папку, пока продукт сохраняет ее.

1 голос
/ 22 сентября 2008

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

Наиболее очевидная, общая группировка - по дате, и она дает вам трехуровневую структуру вложений (год, месяц, день) с относительно безопасным ограничением количества файлов в каждом листовом каталоге (1-3 КБ).

Даже если вам удастся улучшить производительность файловой системы / файлового браузера, похоже, с этой проблемой вы столкнетесь еще через 2 года или 3 года ... просто посмотреть список файлов размером 0,3-1 млн. Это повлечет за собой расходы, поэтому в долгосрочной перспективе может быть лучше найти способы просмотра только небольших подмножеств файлов.

Использование таких инструментов, как 'find' (под cygwin или mingw), может сделать отсутствие проблем с наличием дерева подкаталогов при просмотре файлов.

1 голос
/ 22 сентября 2008

Рассмотрите возможность отправки их на другой сервер, который использует файловую систему, более дружественную к огромному количеству небольших файлов (например, Solaris с ZFS)?

0 голосов
/ 24 февраля 2014

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

Разделите имя файла на части фиксированной длины, а затем создайте вложенные папки для каждого фрагмента, кроме последнего.

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

12.jpg -> 12.jpg
123.jpg -> 12\123.jpg
123456.jpg -> 12\34\123456.jpg

Этот подход означает, что папки содержат файлы и подпапки, но я думаю, что это разумный компромисс.

А вот и 1010 * красивых однострочных оболочек PowerShell, которые помогут вам в этом!

$s = '123456'

-join  (( $s -replace '(..)(?!$)', '$1\' -replace '[^\\]*$','' ), $s )
...