Устранение всех этих подкаталогов занимает время. Вы перегружаете файловую систему.
Возможно, вместо того, чтобы использовать дерево каталогов, вы могли бы вместо этого закодировать информацию о пути в имя файла, поэтому вместо создания файла с путем, подобным этому:
/parent/00/01/02/03/04/05/06/07
/08/09/0A/0B/0C/0D/0E/0F
/10/11/12/13/14/15/16/17
/18/19/1A/1B/1C/1D/1E/1F.txt
... вы можете создать файл с таким путем:
/parent/00_01_02_03_04_05_06_07_
08_09_0A_0B_0C_0D_0E_0F_
10_11_12_13_14_15_16_17_
18_19_1A_1B_1C_1D_1E_1F.txt
... конечно, у вас все еще будет проблема, потому что теперь все ваши десять миллионов файлов будут в одном каталоге, и, по моему опыту (NTFS), каталог с более чем несколькими тысячами файлов в это все еще завышает налоговую нагрузку на файловую систему.
Вы можете придумать гибридный подход:
/parent/00_01_02_03/04_05_06_07
/08_09_0A_0B/0C_0D_0E_0F
/10_11_12_13/14_15_16_17
/18_19_1A_1B/1C_1D_1E_1F.txt
Но это все равно создаст вам проблемы, если вы полностью создадите все эти каталоги. Несмотря на то, что большинство из этих каталогов являются «пустыми» (в том смысле, что они не содержат файлов ), операционная система все еще должна создать запись INODE для каждого каталога, и это занимает место на диске.
Вместо этого вы должны создавать каталог, только когда у вас есть файл для его размещения. Кроме того, если вы удалите все файлы в любом каталоге, то удалите пустой каталог.
На скольких уровнях вы должны создать иерархию каталогов? В моем небольшом примере я преобразовал вашу 32-уровневую иерархию в 8-уровневую иерархию, но после некоторого тестирования вы можете выбрать немного другое отображение. Это действительно зависит от ваших данных и от того, насколько равномерно эти пути распределены в пространстве комбинаторных решений. Вам необходимо оптимизировать решение с двумя ограничениями:
1) Минимизируйте количество каталогов, которые вы создаете, зная, что каждый каталог становится INODE в базовой файловой системе, и создание слишком большого количества из них приведет к перегрузке файловой системы.
2) Минимизируйте количество файлов в каждом каталоге, зная, что слишком большое количество файлов в каталоге (по моему опыту, более 1000) перегружает файловую систему.
Есть еще одно соображение, о котором следует помнить: пространство памяти на дисках адресуется и распределяется с использованием «блоков». Если вы создаете файл, размер которого меньше минимального размера блока, он, тем не менее, занимает весь блок, тратя впустую дисковое пространство. В NTFS эти блоки определяются своим «размером кластера» (который частично определяется общим размером тома) и обычно по умолчанию равен 4 КБ:
http://support.microsoft.com/kb/140365
Таким образом, если вы создадите файл только с одним байтом данных, он все равно будет занимать 4 КБ дискового пространства, тратя впустую 4095 байт.
В своем примере вы сказали, что у вас есть около 10 миллионов файлов с объемом данных около 1 ГБ. Если это правда, то каждый из ваших файлов имеет длину около 100 байт. При размере кластера 4096 коэффициент использования пространства составляет около 98%.
Если это вообще возможно, попробуйте объединить некоторые из этих файлов. Я не знаю, какие данные они содержат, но если это текстовый формат, вы можете попробовать сделать что-то вроде этого:
[id:01_23_45_67_89_AB_CD_EF]
lorem ipsum dolor sit amet consectetur adipiscing elit
[id:fe_dc_ba_98_76_54_32_10]
ut non lorem quis quam malesuada lacinia
[id:02_46_81_35_79_AC_DF_BE]
nulla semper nunc id ligula eleifend pulvinar
... и так далее, и тому подобное. Может показаться, что вы теряете пространство со всеми этими подробными заголовками, но для диска это гораздо более эффективная стратегия, чем наличие отдельных файлов для всех этих маленьких фрагментов. Этот небольшой пример использовал ровно 230 байтов (включая переводы строк) для трех записей, поэтому вы можете попытаться поместить около шестнадцати записей в каждый файл (помня, что гораздо лучше иметь чуть меньше 4096 байтов на файл, чем чуть больше чем 4096, тратя впустую весь дополнительный блок диска).
Во всяком случае, удачи!