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

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

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

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

Ответы [ 14 ]

29 голосов
/ 24 октября 2008

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

Для вступления в силу этой настройки требуется перезагрузка.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Наличие сотен тысяч файлов в одном каталоге действительно приведет к повреждению 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 файлов.

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

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

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

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

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

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

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

...