Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / алгоритм для хранилища файлов / 25 сообщений из 60, страница 1 из 3
05.11.2014, 21:43
    #38796757
tramadol
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
нужно решить проблему хранения нескольких миллионов файлов на диске.
файлы нужно будет добавлять, читать, и удалять.
первое что пришло в голову это реализовать иерархию папок в виде бинарного дерева, в каждой папке хранить один файл, и еще 2 папки на соседние ноды соответственно, и так далее.
вот только не совсем понятно как потом удалять файлы, так как будут оставаться пустые папки.
подскажите какие еще есть варианты решения данной задачи?
...
Рейтинг: 0 / 0
05.11.2014, 21:56
    #38796762
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Бинарное дерево - решение более чем ужасное. Про него можешь даже не думать.

Для начала неплохо бы озвучить файловую систему, на которой это происходит. А ещё лучше - начать именно с подбора файловой системы, предназначенной именно для работы с каталогами, содержащими миллионы файлов. Или даже платформы.

И я бы предложил именно с этой стороны очень внимательно посмотреть на Novell Netware (не OES/SLES, а именно NW версий 5.1 или 6.5).
...
Рейтинг: 0 / 0
05.11.2014, 22:09
    #38796766
tramadol
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Akina, это не коммерческий проект а просто задачка в целях обучения.
использую обычную Win 7 на NTFS
...
Рейтинг: 0 / 0
05.11.2014, 22:16
    #38796770
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
tramadolAkina, это не коммерческий проект а просто задачка в целях обучения.
использую обычную Win 7 на NTFS

раз так - посмотри например на https://code.google.com/p/weed-fs/
...
Рейтинг: 0 / 0
05.11.2014, 22:28
    #38796775
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Может просто хранить "файлы" в БД? Содержимое - в бинарное поле, а "иерархию" имя + любые ваши хотелки - в отдельную таблицу.
Проблема только одна - если будет большАя частота "правки" содержимого файлов. Впрочем, фрагментация и на любой обычной файловой системе - бич тот ещё...
Хотя, нечего придумывать собственный аналог журналируемых ФС
...
Рейтинг: 0 / 0
05.11.2014, 22:31
    #38796777
tramadol
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Изопропил, спс, гляну.
по идее мне нужно реализовать иерархию подобную той где вк хранит картинки?
https://pp.vk.me/c619226/v619226289/1e206/EcVH8rg6ITg.jpg

может кто подскажет как это реализовано у них?
...
Рейтинг: 0 / 0
05.11.2014, 22:34
    #38796780
tramadol
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
AndreTM, БД не катит, задача поставлена именно хранение файлов непосредственно на диске
...
Рейтинг: 0 / 0
05.11.2014, 22:47
    #38796784
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
tramadol,

посмотри как squid файлы хранит
...
Рейтинг: 0 / 0
06.11.2014, 07:05
    #38796904
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Почитай про elliptics Яндекс его использует для хранения картинок.

По одному файлу в папке перебор. Для миллиона достаточно двух уровней: несколько тысяч подпапок, в каждой несколько тысяч файлов.
Миллион файлов не пробовал, 5-10 тысяч нормально обрабатываются в одной папке.

Затестить несложно: нагенери файлов и замеряй тормоза.
По-хорошему лучше БД использовать, содержимое файлов туда не обязательно грузить, а вот список файлов с точным расположением даст ускорение поиска места хранения файла.
...
Рейтинг: 0 / 0
06.11.2014, 11:05
    #38797065
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
tramadolнужно решить проблему хранения нескольких миллионов файлов на диске.
файлы нужно будет добавлять, читать, и удалять.
первое что пришло в голову это реализовать иерархию папок в виде бинарного дерева, в каждой папке хранить один файл, и еще 2 папки на соседние ноды соответственно, и так далее.
вот только не совсем понятно как потом удалять файлы, так как будут оставаться пустые папки.
подскажите какие еще есть варианты решения данной задачи?
Современные файловые системы приблизились уже к БД. У них есть журналы транзакций.
Снапшоты. Восстановление после сбоя и различные варианты Software Raid и LVM в коробке.

Посмотри к примеру Sun/ZFS

https://ru.wikipedia.org/wiki/ZFS

Количество файлов в директории ограничено 2^56.

Никаких бинарных деревьев не нужно придумывать. Логическая структура должна отражать
только бизнес-задачу в ракурсе "запросов". А если дополнительно создавать структуры
symlinks то можно делать даже нечто вроде "индекса".

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

Пожалуй это единственный недостаток большого количества файлов в папке.
...
Рейтинг: 0 / 0
06.11.2014, 11:06
    #38797066
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Dima TПочитай про elliptics Яндекс его использует для хранения картинок.

По одному файлу в папке перебор. Для миллиона достаточно двух уровней: несколько тысяч подпапок, в каждой несколько тысяч файлов.
Миллион файлов не пробовал, 5-10 тысяч нормально обрабатываются в одной папке.

Затестить несложно: нагенери файлов и замеряй тормоза.
По-хорошему лучше БД использовать, содержимое файлов туда не обязательно грузить, а вот список файлов с точным расположением даст ускорение поиска места хранения файла.

ну вопервых, точное расположение файла не намного ускорит доступ к нему.

от того что вы знаете что в папке1 в папке2 лежит файл3 не означает что система знает где его искать.

ей всеравно надо считать данные корневого каталога - не выж один умный програмист, а и тот кто писал ОС - стоит команда - если не существует папки1 выход иначе читаем адрес расположения данных папки1, читаем шдд с нового места - аналогично смотрим существует ли папка2, и если да то читаем где её данные, и только в её даных проверив что файл3 существует идём в нужное место на шдд и читаем.

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

итого - если у тебя в корне 30 папко в каждой по до 10, и в каждой до 100 файлов, и в одной из них 10000 файлов и у тебя быстро, вовсе не означает

что при 10000 папок в каждой по 10000 файлов у тебя будет быстро работать в многопользовательском режиме система.

ЗЫ
у меня хранение файлов идёт в подпапках 3 шестнадцетиричные цифры...тоесть 4096 подпапок. сейчас проверил... по ним раскидано 1.6+млн файлов.

если скажете что замерять по времени доступа - замерю. (хдд сам счас не интересуюсь, ибо хранилище распределённое, и сетевые задержки счас узкое место а не винчестер)
...
Рейтинг: 0 / 0
06.11.2014, 11:58
    #38797124
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
tramadolAkina, это не коммерческий проект а просто задачка в целях обучения.
C этого надо было начинать.

tramadolпервое что пришло в голову
Первое, что ДОЛЖНО БЫЛО прийти в голову - это тщательно изучить, как обстоят дела с хранением большого количества файлов в существующих ФС, хотя бы самых распространённых. Изучить техническую документацию, понять, как именно выполняются хранение и поиск, даже как будут болтаться головы по диску и как на эту болтанку влияет кэширование контроллера диска и ОС.

Вы же сгенерили на пустом месте идею (из категории "ляпнуть хоть что-то") и бросились задавать вопросы. Так не учатся.

PS. Извините за некоторую резкость суждения.
...
Рейтинг: 0 / 0
06.11.2014, 13:13
    #38797226
S.G.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
mayton https://ru.wikipedia.org/wiki/ZFS

Количество файлов в директории ограничено 2^56.

Никаких бинарных деревьев не нужно придумывать. Логическая структура должна отражать
только бизнес-задачу в ракурсе "запросов". А если дополнительно создавать структуры
symlinks то можно делать даже нечто вроде "индекса".

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

+1

Медленное чтение будет, если действительно загрузить в одну директорию миллион файлов.
Но если в одной директории хранить около 1000 файлов, в 1000 директорий получится миллион, без особой задержки, для любой ФС/файлового браузера.
...
Рейтинг: 0 / 0
06.11.2014, 15:04
    #38797364
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
alex564657498765453ну вопервых, точное расположение файла не намного ускорит доступ к нему.

от того что вы знаете что в папке1 в папке2 лежит файл3 не означает что система знает где его искать.
Знает. Каталог у NTFS хранится в виде дерева. Получение информации о файле (стартовый кластер/запись в MFT) на основе точного имени получается за O(log N). Для неточного имени нужно полное сканирование каталога, это O(N). Почувствуй разницу.
...
Рейтинг: 0 / 0
06.11.2014, 15:17
    #38797375
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Dimitry Sibiryakovalex564657498765453ну вопервых, точное расположение файла не намного ускорит доступ к нему.

от того что вы знаете что в папке1 в папке2 лежит файл3 не означает что система знает где его искать.
Знает. Каталог у NTFS хранится в виде дерева. Получение информации о файле (стартовый кластер/запись в MFT) на основе точного имени получается за O(log N). Для неточного имени нужно полное сканирование каталога, это O(N). Почувствуй разницу.

не точное имя - это как?

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

тоесть что выполнять команды сд пока не доёдешь до нужной папки и потом кат - вывод файла, что сразу задать кат полный путь, пропуская издержки самих вызовов сд, а сконцентрировавшись на операциях чтения с шдд самой файловой системы(файловая система читает а не мы читаем фс) - число чтений и что именно считываеться будет одинаково...

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

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

я к чему виду...что экономия получиться на уменьшении числа прыжков по фс.

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

вместо лишнего прыжка из папки в подпапку.

а дерево нтфс - это её слабое место!
...
Рейтинг: 0 / 0
06.11.2014, 15:18
    #38797378
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
alex564657498765453,

всмысле нтфс самая медленая из распространёных ФС для работы с деревом папка в паке и разбросаны файлы под нагрузкой
...
Рейтинг: 0 / 0
06.11.2014, 15:21
    #38797382
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
а всё изза того, что О(Н) сздесь никселу ни к городу.

пример

find -type f | grep -c './'

в обоих случаях О(Н)

но для 100 000 файлов подобная процедура проходила..точно не помню но до минуты...я ждал но не долго(сервер был тоже под нагрузкой)

сегодня для 1.6 млн под такойже нагрузкой сервер и данная команда уже и за 6 минут не справилось устал ждать
...
Рейтинг: 0 / 0
06.11.2014, 15:54
    #38797430
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
alex564657498765453не точное имя - это как?FindFirst/FindNext. Ну или readdir в юниксах.
...
Рейтинг: 0 / 0
06.11.2014, 16:10
    #38797452
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Многие из присутсвующих мыслят категориями FAT16/32/DOS. В современных фс
поиск блоков файла по маршруту связан с несколькимими поисками строки
в B+Tree (NTFS) или HTree (ext2/ext3).
...
Рейтинг: 0 / 0
06.11.2014, 16:23
    #38797467
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Двоичное дерево не отменяет необходимость полного чтения каталога для целого ряда сценариев.

P.S. Прежде чем поминать DOS всуе - полезно почитать msdn
...
Рейтинг: 0 / 0
06.11.2014, 16:27
    #38797472
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Basil A. SidorovДвоичное дерево не отменяет необходимость полного чтения каталога для целого ряда сценариев.

P.S. Прежде чем поминать DOS всуе - полезно почитать msdn
Извини я не понял при чём тут msdn.
...
Рейтинг: 0 / 0
06.11.2014, 16:44
    #38797496
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Basil A. SidorovДвоичное дерево не отменяет необходимость полного чтения каталога для целого ряда сценариев...
что значит "сценария" и "необходимость полного чтения каталога" ?

понятно, что зайти в такой директорий FAR'ом или эксплорером может быть достаточно долго, когда пойдет создание говно-GUI для ляма файлов. Но к файловой системе это никакого отношения не имеет. Сами же операции с файлами (открыть файл и так далее) от кол-ва файлов в директории сильно зависеть не должны, в отличие от FAT

Автор свои требования назвал "добавлять, читать, и удалять". Подозреваю, что NTFS для данных сценариев замечательно миллион файлов переварит. Директории по > 50 тысяч файлов на компьютере Pentium 166 с 16 Mb RAM на NT 2000 жили замечательно
...
Рейтинг: 0 / 0
06.11.2014, 16:50
    #38797508
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
При том, что FindFirst/FindNext как были частью файлового API DOS, OS/2, Windows - так и остались в его составе.
Кроме того, рассуждая об алгоритмической эффективности двоичного поиска не стОит забывать, что создание файла требует проверки существования имени, что, в свою очередь, требует сериализации в многопоточной среде, что, в свою очередь, существенно влияет на скорость создания новых файлов в "длинных" каталогах.
А так - да, O(log(n)) - весьма быстро.
...
Рейтинг: 0 / 0
06.11.2014, 16:55
    #38797514
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Leonid KudryavtsevАвтор свои требования назвал "добавлять, читать, и удалять". Подозреваю, что NTFS для данных сценариев замечательно миллион файлов переварит. Директории по > 50 тысяч файлов на компьютере Pentium 166 с 16 Mb RAM на NT 2000 жили замечательноЭто всё потому, что при таких ресурсах существенно многопоточный доступ был весьма проблематичен.
Со своей стороны могу сказать, что в реальной системе от хранения файлов в одном каталоге отказались практически сразу. Хотя за пятьдесят тысяч файлов это "хранилище" перевалить успело.
В дальнейшем не выёживались и сделали иерархическую структуру. Хотя и с корявым ключом.
...
Рейтинг: 0 / 0
06.11.2014, 17:01
    #38797523
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
алгоритм для хранилища файлов
Basil A. SidorovПри том, что FindFirst/FindNext как были частью файлового API DOS, OS/2, Windows - так и остались в его составе....
Если требуется по бизнесу создать список всех миллиона файлов, что FindFirst/FindNext в 1 директории в лям файлов, что тысяча циклов FindFirst/FindNext в каждом из тысячи директориев по тысячи файлов - подозреваю время будет одинаковое )))
Basil A. SidorovКроме того, рассуждая об алгоритмической эффективности двоичного поиска не стОит забывать, что создание файла требует проверки существования имени, что, в свою очередь, требует сериализации в многопоточной среде, что, в свою очередь, существенно влияет на скорость создания новых файлов в "длинных" каталогах.

Что то уж очень умное )))

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

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

===
По большей части, решение определяется набором требуемых операций. Если просто хранилище файлов и их отдача - думаю разница не большая. Если требуется какие-то другие работы - резервирование, заходить в директории FAR'ом, архивировать, переность. То, возможно тысяча директориев по тысячи файлов будет удобнее. НО может быть и наоборот , когда одна директория хоть пусть и в миллион файлов будет удобнее.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / алгоритм для хранилища файлов / 25 сообщений из 60, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]