Лучшая конфигурация папок для приложения, которое открывает около 1 миллиона файлов и устраняет проблемы
У меня есть приложение, которое создает 16^5 файлов (1048576). Я могу настроить его так, чтобы все они создавались в одной и той же папке или были разделены так, как я хочу (имея 1, 2, 3 или 4 подпапки в каждой папке). Пример:
/*
или же
/a/*
.
.
.
/f/*
или же
/a/a/*
/a/b/*
.
.
.
/f/f/*
или же
/a/a/a/*
.
.
.
/f/f/f/*
или же
/a/a/a/a/*
/a/a/a/b/*
.
.
.
/f/f/f/f/*
Все файлы имеют менее 4 КБ. Я использую Ubuntu 12.10 64bit и раздел ext4 для хранения этого. Какая структура папок будет лучшей структурой для этого случая? Может быть, другие файловые системы лучше всего подойдут для этого случая, есть идеи?
В любом случае я пытаюсь запустить этот алгоритм, я должен быть в состоянии открыть файлы 9999999:
user@pc$ ulimit
unlimited
user@pc$ cat /proc/sys/fs/file-max
9999999
user@pc$ cat /etc/sysctl.conf
fs.file-max = 9999999
Тем не менее, когда я запускаю его, сохраняя все в одной папке, вызов fopen завершается ошибкой около 999999 файлов:
user@pc$ ls database/ | wc -l
999958
Странно, но этот 999999 был моим предыдущим значением для file-max в системных файлах. Я, конечно, перезагрузил свою машину до того, как обновил значение, может быть, оно слишком велико, а затем оно сохраняет последнее. Что может быть не так?
1 ответ
Если вы посмотрите на proc (5), /proc/sys/fs/file-max
msgstr "определяет общесистемное ограничение на количество открытых файлов для всех процессов". В частности, это не говорит о том, что один процесс может открыть столько файлов.
Вы можете обратиться к sysconf (3), который описывает OPEN_MAX
как "Максимальное количество файлов, которые процесс может открыть в любое время". Вы можете получить это значение, запустив getconf OPEN_MAX
,
Я на самом деле не знаю, как много вы можете сделать OPEN_MAX
и я не склонен к дальнейшему расследованию в этот час, но не стесняйтесь экспериментировать и сообщать нам.
Кстати, я бы тоже побежал ulimit -a
показать все границы. Бег ulimit
один в bash
подразумевает ulimit -f
, который показывает только максимальный размер файлов, написанных оболочкой и ее дочерними элементами.
PS Если ваше приложение должно одновременно содержать миллион файлов, я настоятельно рекомендую переоценить ваш дизайн.