Эффективная обработка более 2 миллионов файлов
У меня есть файловая база данных, в которой хранится около 2 миллионов файлов в трех уровнях подкаталогов.
2/2/6253
2/2/6252
...
Размер файла варьируется от 30 байтов до 60 КБ. Вся БД только для чтения. БД составляет около 125 гигабайт.
Добавлено: все файлы сжаты zlib (python)
Я хочу обработать все это как один файл с файловой системой в нем. Какую файловую систему я бы выбрал лучше всего?
На данный момент я использую следующий скрипт:
dd if=/dev/zero of=/my_file.iso bs=1024K count=60000
mkfs.ext4 -f /my_file.iso
mount -o loop /my_file.iso /mnt/
4 ответа
Вы, вероятно, просто хотите использовать XFS.
Он вполне способен на то, что вы просите, и делает свою работу.
Нет причин усложнять это с менее используемыми файловыми системами, которые могут идти с другими компромиссами.
Пожалуйста, смотрите: Как количество подкаталогов влияет на производительность чтения / записи диска в Linux? и влияние высокого отношения каталогов к файлам на XFS
Если вы хотите что-то более эзотерическое, ZFS zvols с файловой системой сверху может предоставить интересную альтернативу (для целей сжатия, целостности и переносимости).
Смотрите здесь: Прозрачная файловая система сжатия в сочетании с ext4
Видя количество маленьких файлов, я бы подумал об использовании SquashFS. Особенно, если у вас достаточно мощный процессор (т.е. нет Pentium III или 1 ГГц ARM).
В зависимости от типа хранимых данных, SquashFS может значительно уменьшить свой размер и, следовательно, количество операций ввода-вывода при чтении. Единственным недостатком является использование процессора при чтении. С другой стороны, любой современный процессор может распаковываться на скоростях, намного превосходящих HDD и, возможно, даже SSD.
Как еще одно преимущество - вы экономите место / пропускную способность и / или время, потраченное на распаковку после передачи.
Некоторые тесты, сравнивающие это с ISO и другими подобными средствами. Как и в любом тесте, возьмите его с крошкой соли, а лучше - подделайте свой.;-)
Редактировать: в зависимости от обстоятельств (и я не смею догадываться здесь) SquashFS без сжатия (mksquashfs -noD
) может превзойти ext4, так как код для чтения должен быть намного проще и оптимизирован для работы только для чтения. Но это действительно зависит от вас, чтобы сравнить в вашем случае использования. Еще одним преимуществом является то, что образ SquashFS немного больше ваших данных. С Ext4 вы всегда должны создавать петли большего размера. Недостаток, конечно, в том, что это довольно неудобно, когда вам нужно изменить данные. Это намного проще с ext4.
Если это только для чтения, почему бы не использовать файл ISO? Ты можешь использовать genisoimage
или же mkisofs
,
Если вы хотите сжать все это, вы также можете использовать squashfs
другая файловая система только для чтения с очень высокой степенью сжатия.
Я не уверен, соответствует ли это вашей цели, но рассмотрели ли вы tar
объединить несколько файлов? Это может снизить требования к давлению и пространству в файловой системе, и приложение базы данных может считывать данные для определенного файла одним из множества tar
библиотеки вокруг.
В зависимости от вашей схемы доступа это может даже увеличить производительность.