Как вы справляетесь с большим количеством маленьких файлов?

StackOverflow https://stackoverflow.com/questions/115882

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Производительность NTFS резко снижается после 10 000 файлов в каталоге.Что вы делаете, так это создаете дополнительный уровень в иерархии каталогов, где каждый подкаталог содержит 10 000 файлов.

Как бы то ни было, именно этот подход использовали ребята из SVN. версия 1.5.В качестве порога по умолчанию они использовали 1000 файлов.

Другие советы

На самом деле NTFS будет нормально работать со многими, более чем 10 000 файлами в каталоге, если вы укажете ей прекратить создавать альтернативные имена файлов, совместимые с 16-битными платформами Windows.По умолчанию NTFS автоматически создает имя файла «8 точек 3» для каждого создаваемого файла.Это становится проблемой, когда в каталоге много файлов, поскольку Windows просматривает файлы в каталоге, чтобы убедиться, что создаваемое ими имя еще не используется.Вы можете отключить именование «8 точек 3», установив для параметра реестра NtfsDisable8dot3NameCreation значение 1.Значение находится в пути реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem.Это изменение безопасно вносить, поскольку файлы имен «8 точек 3» требуются только программам, написанным для очень старых версий Windows.

Прежде чем этот параметр вступит в силу, потребуется перезагрузка.

Проблема с производительностью вызвана огромным количеством файлов в одном каталоге:как только вы это устраните, все будет в порядке.Это не проблема, связанная с NTFS:на самом деле, это часто встречается с домашними/почтовыми файлами пользователей в больших системах UNIX.

Один из очевидных способов решения этой проблемы — перемещение файлов в папки с именем, основанным на имени файла.Предполагая, что все ваши файлы имеют имена файлов одинаковой длины, например.ABCDEFGHI.db, ABCEFGHIJ.db и т. д. создают такую ​​структуру каталогов:

ABC\
    DEF\
        ABCDEFGHI.db
    EFG\
        ABCEFGHIJ.db

Используя эту структуру, вы можете быстро найти файл по его имени.Если имена файлов имеют переменную длину, выберите максимальную длину и добавьте в начало нули (или любой другой символ), чтобы определить каталог, к которому принадлежит файл.

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

Вы можете попробовать использовать что-то вроде Solid File System.

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

http://www.eldos.com/solfsdrv/

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

Кроме того, можете ли вы переместить файлы старше, скажем, года в другое (но все еще доступное) место?

Наконец, и снова, это требует от вас умения вычислять имена. Вы обнаружите, что прямой доступ к файлу происходит намного быстрее, чем попытка открыть его через проводник.Например, говоря
notepad.exe "P:\ath o\your\filen.ame"
из командной строки на самом деле должно быть довольно быстро, если вы знаете путь к нужному файлу без необходимости получения списка каталогов.

Один из распространенных приемов — просто создать несколько подкаталогов и разделить файлы.

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

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

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

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

1.xml
24.xml
12331.xml
2304252.xml

вы можете отсортировать их по каталогам следующим образом:

data/1.xml
data/24.xml
data/1/3/3/12331.xml
data/2/5/2/4/0/2304252.xml

Эта схема гарантирует, что в каждом каталоге никогда не будет более 100 файлов.

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

Вы можете перейти к ZFS или какой-либо другой файловой системе, которая лучше обрабатывает небольшие файлы, но все равно остановиться и спросить, НУЖНО ли вам хранить небольшие файлы.

В нашем случае мы в конечном итоге перешли к системе, в которой все небольшие файлы за определенную дату были добавлены в стиле TAR с простыми разделителями для их анализа.Число файлов на диске увеличилось с 1,2 миллиона до нескольких тысяч.На самом деле они загружались быстрее, потому что NTFS не очень хорошо справляется с небольшими файлами, и в любом случае диск лучше кэшировал файл размером 1 МБ.В нашем случае время доступа и анализа для поиска нужной части файла было минимальным по сравнению с фактическим хранением и обслуживанием сохраненных файлов.

Помимо размещения файлов в подкаталогах..

Лично я бы разработал приложение, которое бы сохраняло интерфейс этой папки одинаковым, т.е. все файлы отображаются как отдельные файлы.Затем в фоновом режиме приложения эти файлы фактически берутся и объединяются в файлы большего размера (а поскольку размеры всегда равны 64 КБ, получить необходимые данные должно быть относительно легко). Чтобы избавиться от беспорядка, который у вас есть.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

И вот красивый PowerShell в одну строку, чтобы помочь вам!

$s = '123456'

-join  (( $s -replace '(..)(?!$)', '$1\' -replace '[^\\]*$','' ), $s )
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top