|
|
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
нужно решить проблему хранения нескольких миллионов файлов на диске. файлы нужно будет добавлять, читать, и удалять. первое что пришло в голову это реализовать иерархию папок в виде бинарного дерева, в каждой папке хранить один файл, и еще 2 папки на соседние ноды соответственно, и так далее. вот только не совсем понятно как потом удалять файлы, так как будут оставаться пустые папки. подскажите какие еще есть варианты решения данной задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 21:43 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Бинарное дерево - решение более чем ужасное. Про него можешь даже не думать. Для начала неплохо бы озвучить файловую систему, на которой это происходит. А ещё лучше - начать именно с подбора файловой системы, предназначенной именно для работы с каталогами, содержащими миллионы файлов. Или даже платформы. И я бы предложил именно с этой стороны очень внимательно посмотреть на Novell Netware (не OES/SLES, а именно NW версий 5.1 или 6.5). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 21:56 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Akina, это не коммерческий проект а просто задачка в целях обучения. использую обычную Win 7 на NTFS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 22:09 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
tramadolAkina, это не коммерческий проект а просто задачка в целях обучения. использую обычную Win 7 на NTFS раз так - посмотри например на https://code.google.com/p/weed-fs/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 22:16 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Может просто хранить "файлы" в БД? Содержимое - в бинарное поле, а "иерархию" имя + любые ваши хотелки - в отдельную таблицу. Проблема только одна - если будет большАя частота "правки" содержимого файлов. Впрочем, фрагментация и на любой обычной файловой системе - бич тот ещё... Хотя, нечего придумывать собственный аналог журналируемых ФС ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 22:28 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Изопропил, спс, гляну. по идее мне нужно реализовать иерархию подобную той где вк хранит картинки? https://pp.vk.me/c619226/v619226289/1e206/EcVH8rg6ITg.jpg может кто подскажет как это реализовано у них? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 22:31 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
AndreTM, БД не катит, задача поставлена именно хранение файлов непосредственно на диске ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 22:34 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
tramadol, посмотри как squid файлы хранит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2014, 22:47 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Почитай про elliptics Яндекс его использует для хранения картинок. По одному файлу в папке перебор. Для миллиона достаточно двух уровней: несколько тысяч подпапок, в каждой несколько тысяч файлов. Миллион файлов не пробовал, 5-10 тысяч нормально обрабатываются в одной папке. Затестить несложно: нагенери файлов и замеряй тормоза. По-хорошему лучше БД использовать, содержимое файлов туда не обязательно грузить, а вот список файлов с точным расположением даст ускорение поиска места хранения файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 07:05 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
tramadolнужно решить проблему хранения нескольких миллионов файлов на диске. файлы нужно будет добавлять, читать, и удалять. первое что пришло в голову это реализовать иерархию папок в виде бинарного дерева, в каждой папке хранить один файл, и еще 2 папки на соседние ноды соответственно, и так далее. вот только не совсем понятно как потом удалять файлы, так как будут оставаться пустые папки. подскажите какие еще есть варианты решения данной задачи? Современные файловые системы приблизились уже к БД. У них есть журналы транзакций. Снапшоты. Восстановление после сбоя и различные варианты Software Raid и LVM в коробке. Посмотри к примеру Sun/ZFS https://ru.wikipedia.org/wiki/ZFS Количество файлов в директории ограничено 2^56. Никаких бинарных деревьев не нужно придумывать. Логическая структура должна отражать только бизнес-задачу в ракурсе "запросов". А если дополнительно создавать структуры symlinks то можно делать даже нечто вроде "индекса". Но если ты действительно прогрузишь в 1 директорию несколько млн. файлов то заходить в нее файловым браузером не стоит. Он подвиснет. Возможно. Но это не проблема твоей задачи или файловой системы. Это только проблема конкретного файлового браузера. Пожалуй это единственный недостаток большого количества файлов в папке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 11:05 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Dima TПочитай про elliptics Яндекс его использует для хранения картинок. По одному файлу в папке перебор. Для миллиона достаточно двух уровней: несколько тысяч подпапок, в каждой несколько тысяч файлов. Миллион файлов не пробовал, 5-10 тысяч нормально обрабатываются в одной папке. Затестить несложно: нагенери файлов и замеряй тормоза. По-хорошему лучше БД использовать, содержимое файлов туда не обязательно грузить, а вот список файлов с точным расположением даст ускорение поиска места хранения файла. ну вопервых, точное расположение файла не намного ускорит доступ к нему. от того что вы знаете что в папке1 в папке2 лежит файл3 не означает что система знает где его искать. ей всеравно надо считать данные корневого каталога - не выж один умный програмист, а и тот кто писал ОС - стоит команда - если не существует папки1 выход иначе читаем адрес расположения данных папки1, читаем шдд с нового места - аналогично смотрим существует ли папка2, и если да то читаем где её данные, и только в её даных проверив что файл3 существует идём в нужное место на шдд и читаем. в реальности это только первый раз долго, второй раз заглянуть в туже папку будет быстрее - ибо идёт кеширование файловой системы. итого - если у тебя в корне 30 папко в каждой по до 10, и в каждой до 100 файлов, и в одной из них 10000 файлов и у тебя быстро, вовсе не означает что при 10000 папок в каждой по 10000 файлов у тебя будет быстро работать в многопользовательском режиме система. ЗЫ у меня хранение файлов идёт в подпапках 3 шестнадцетиричные цифры...тоесть 4096 подпапок. сейчас проверил... по ним раскидано 1.6+млн файлов. если скажете что замерять по времени доступа - замерю. (хдд сам счас не интересуюсь, ибо хранилище распределённое, и сетевые задержки счас узкое место а не винчестер) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 11:06 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
tramadolAkina, это не коммерческий проект а просто задачка в целях обучения. C этого надо было начинать. tramadolпервое что пришло в голову Первое, что ДОЛЖНО БЫЛО прийти в голову - это тщательно изучить, как обстоят дела с хранением большого количества файлов в существующих ФС, хотя бы самых распространённых. Изучить техническую документацию, понять, как именно выполняются хранение и поиск, даже как будут болтаться головы по диску и как на эту болтанку влияет кэширование контроллера диска и ОС. Вы же сгенерили на пустом месте идею (из категории "ляпнуть хоть что-то") и бросились задавать вопросы. Так не учатся. PS. Извините за некоторую резкость суждения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 11:58 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
mayton https://ru.wikipedia.org/wiki/ZFS Количество файлов в директории ограничено 2^56. Никаких бинарных деревьев не нужно придумывать. Логическая структура должна отражать только бизнес-задачу в ракурсе "запросов". А если дополнительно создавать структуры symlinks то можно делать даже нечто вроде "индекса". Но если ты действительно прогрузишь в 1 директорию несколько млн. файлов то заходить в нее файловым браузером не стоит. Он подвиснет. Возможно. Но это не проблема твоей задачи или файловой системы. Это только проблема конкретного файлового браузера. +1 Медленное чтение будет, если действительно загрузить в одну директорию миллион файлов. Но если в одной директории хранить около 1000 файлов, в 1000 директорий получится миллион, без особой задержки, для любой ФС/файлового браузера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 13:13 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
alex564657498765453ну вопервых, точное расположение файла не намного ускорит доступ к нему. от того что вы знаете что в папке1 в папке2 лежит файл3 не означает что система знает где его искать. Знает. Каталог у NTFS хранится в виде дерева. Получение информации о файле (стартовый кластер/запись в MFT) на основе точного имени получается за O(log N). Для неточного имени нужно полное сканирование каталога, это O(N). Почувствуй разницу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 15:04 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovalex564657498765453ну вопервых, точное расположение файла не намного ускорит доступ к нему. от того что вы знаете что в папке1 в папке2 лежит файл3 не означает что система знает где его искать. Знает. Каталог у NTFS хранится в виде дерева. Получение информации о файле (стартовый кластер/запись в MFT) на основе точного имени получается за O(log N). Для неточного имени нужно полное сканирование каталога, это O(N). Почувствуй разницу. не точное имя - это как? речь шла о ...как я подумал, что человек щитает, что если он знает точное имя файла с полным путём, то сразу система знает где его искать...аля хеш от полного пути и в базе сразу видим адресс. и расписал, что всёравно процесс итерационный...по каждой папке в глубину будет ити обработка... тоесть что выполнять команды сд пока не доёдешь до нужной папки и потом кат - вывод файла, что сразу задать кат полный путь, пропуская издержки самих вызовов сд, а сконцентрировавшись на операциях чтения с шдд самой файловой системы(файловая система читает а не мы читаем фс) - число чтений и что именно считываеться будет одинаково... и когда я говорил что для одной папки с 10000 быстро не означает 10000 папок и 10000 файлов в каждой будет быстро - речь шла имено о работе кеша файловой системы. одна большая папка - лежит себе этот большой кусок в памяти и лежит. при 10000 больших кусков все в кеш не вместиться, и получиться что на каждый файл(предположительно в разных папках) мы будем проходить всё дерево... я к чему виду...что экономия получиться на уменьшении числа прыжков по фс. вот и получаем - что для таких задач, лучше искать файловую систему ращитаную на большое число файлов...и такие фс не с увеличеным кешем для приколов с подкаталогами, а с индексацией, для того чтоб в одной папке лежало много файлов, а в кеше лежал индекс, что по имени файла мы знаем сразу какой кусок списка каталога считать вместо лишнего прыжка из папки в подпапку. а дерево нтфс - это её слабое место! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 15:17 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, всмысле нтфс самая медленая из распространёных ФС для работы с деревом папка в паке и разбросаны файлы под нагрузкой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 15:18 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
а всё изза того, что О(Н) сздесь никселу ни к городу. пример find -type f | grep -c './' в обоих случаях О(Н) но для 100 000 файлов подобная процедура проходила..точно не помню но до минуты...я ждал но не долго(сервер был тоже под нагрузкой) сегодня для 1.6 млн под такойже нагрузкой сервер и данная команда уже и за 6 минут не справилось устал ждать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 15:21 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
alex564657498765453не точное имя - это как?FindFirst/FindNext. Ну или readdir в юниксах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 15:54 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Многие из присутсвующих мыслят категориями FAT16/32/DOS. В современных фс поиск блоков файла по маршруту связан с несколькимими поисками строки в B+Tree (NTFS) или HTree (ext2/ext3). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 16:10 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Двоичное дерево не отменяет необходимость полного чтения каталога для целого ряда сценариев. P.S. Прежде чем поминать DOS всуе - полезно почитать msdn ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 16:23 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovДвоичное дерево не отменяет необходимость полного чтения каталога для целого ряда сценариев. P.S. Прежде чем поминать DOS всуе - полезно почитать msdn Извини я не понял при чём тут msdn. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 16:27 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovДвоичное дерево не отменяет необходимость полного чтения каталога для целого ряда сценариев... что значит "сценария" и "необходимость полного чтения каталога" ? понятно, что зайти в такой директорий FAR'ом или эксплорером может быть достаточно долго, когда пойдет создание говно-GUI для ляма файлов. Но к файловой системе это никакого отношения не имеет. Сами же операции с файлами (открыть файл и так далее) от кол-ва файлов в директории сильно зависеть не должны, в отличие от FAT Автор свои требования назвал "добавлять, читать, и удалять". Подозреваю, что NTFS для данных сценариев замечательно миллион файлов переварит. Директории по > 50 тысяч файлов на компьютере Pentium 166 с 16 Mb RAM на NT 2000 жили замечательно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 16:44 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
При том, что FindFirst/FindNext как были частью файлового API DOS, OS/2, Windows - так и остались в его составе. Кроме того, рассуждая об алгоритмической эффективности двоичного поиска не стОит забывать, что создание файла требует проверки существования имени, что, в свою очередь, требует сериализации в многопоточной среде, что, в свою очередь, существенно влияет на скорость создания новых файлов в "длинных" каталогах. А так - да, O(log(n)) - весьма быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 16:50 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevАвтор свои требования назвал "добавлять, читать, и удалять". Подозреваю, что NTFS для данных сценариев замечательно миллион файлов переварит. Директории по > 50 тысяч файлов на компьютере Pentium 166 с 16 Mb RAM на NT 2000 жили замечательноЭто всё потому, что при таких ресурсах существенно многопоточный доступ был весьма проблематичен. Со своей стороны могу сказать, что в реальной системе от хранения файлов в одном каталоге отказались практически сразу. Хотя за пятьдесят тысяч файлов это "хранилище" перевалить успело. В дальнейшем не выёживались и сделали иерархическую структуру. Хотя и с корявым ключом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 16:55 |
|
||
|
алгоритм для хранилища файлов
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovПри том, что FindFirst/FindNext как были частью файлового API DOS, OS/2, Windows - так и остались в его составе.... Если требуется по бизнесу создать список всех миллиона файлов, что FindFirst/FindNext в 1 директории в лям файлов, что тысяча циклов FindFirst/FindNext в каждом из тысячи директориев по тысячи файлов - подозреваю время будет одинаковое ))) Basil A. SidorovКроме того, рассуждая об алгоритмической эффективности двоичного поиска не стОит забывать, что создание файла требует проверки существования имени, что, в свою очередь, требует сериализации в многопоточной среде, что, в свою очередь, существенно влияет на скорость создания новых файлов в "длинных" каталогах. Что то уж очень умное ))) В целом мысль уловил.... но это уже от нагрузки зависит. Если происходит сотни/тысячи созданий файлов в секунду, возможно разница будет принципиальная Но, мне кажется, что в файловой системе затыки произойдут значительно раньше. === По большей части, решение определяется набором требуемых операций. Если просто хранилище файлов и их отдача - думаю разница не большая. Если требуется какие-то другие работы - резервирование, заходить в директории FAR'ом, архивировать, переность. То, возможно тысяча директориев по тысячи файлов будет удобнее. НО может быть и наоборот , когда одна директория хоть пусть и в миллион файлов будет удобнее. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2014, 17:01 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38796762&tid=1341166]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
92ms |
get tp. blocked users: |
2ms |
| others: | 262ms |
| total: | 470ms |

| 0 / 0 |
