У меня есть десктопный проект (win32/C++/MFC), в котором информация может снабжаться картинками; картинки при этом хранятся в базе данных в BLOB-полях. БД без картинок занимает примерно 3-15 мегабайт, с картинками — сотню-полторы мегабайт; баз данных крупнее 700MB я у пользователей не видел. Я не замечал, чтобы наличие картинок в БД как-то замедляло работу программы.
Сейчас хочу вынести часть этого проекта в веб: php+mysql. Скажите, где правильно будет хранить картинки, в базе данных или в отдельной папке на сервере?
Здравствуйте, sushko, Вы писали:
s> Сейчас хочу вынести часть этого проекта в веб: php+mysql. Скажите, где правильно будет хранить картинки, в базе данных или в отдельной папке на сервере?
Здравствуйте, VikDD, Вы писали:
VDD>что бы потом не напороться на лимиты файловых дескрипторов ФС
А подробнее об этом можно? Гугля расшифровывает только "лимиты ОТКРЫТЫХ файловых дескрипторов", т.е. к-во одновременно открытых файлов. С раскладыванию файлов по папкам эта проблема, очевидно, не относится...
Здравствуйте, sushko, Вы писали:
s> VDD>что бы потом не напороться на лимиты файловых дескрипторов ФС s> А подробнее об этом можно? Гугля расшифровывает только "лимиты ОТКРЫТЫХ файловых дескрипторов", т.е. к-во одновременно открытых файлов. С раскладыванию файлов по папкам эта проблема, очевидно, не относится...
Количество inode на файловой системе.
$ df -i
Файловая система Iнодов IИспользовано IСвободно IИспользовано% Cмонтировано в
/dev/md1 915546112 61340827 854205285 7% /
Но выше написано немного про другое. Сложность поиска файла в директории EXT4 составляет O(log n). Следовательно, чем больше файлов в директории, тем больше времени будет тратиться на поиск. Оптимально будет раскидать большое число файлов на 1-2 уровня вложенных директорий. Например, md5 хэш файла имеет значение:
72bfb007fadf8b09231e26423a4472b8
тогда этот файл кладется по пути:
/8/2b/72bfb007fadf8b09231e26423a4472b8
(md5 тут не принципиально — исключительно для демонстрации принципа).
Здравствуйте, Anton Batenev, Вы писали:
AB>Количество inode на файловой системе.
А не расскажет ли уважаемый all, почему внутри Amazon S3 для хранения данных используется именно BDB и MySQL, а не просто "файлы-на-файловой-системе", столь любимые нашими одминами? Говорят, что Tumblr (сайт такой, с картинками) хранил свои картинки именно в многопетабайтном S3 bucket.
Здравствуйте, Слава, Вы писали:
С>А не расскажет ли уважаемый all, почему внутри Amazon S3 для хранения данных используется именно BDB и MySQL, а не просто "файлы-на-файловой-системе", столь любимые нашими одминами? Говорят, что Tumblr (сайт такой, с картинками) хранил свои картинки именно в многопетабайтном S3 bucket.
Потому что это хранилище, а не веб-сервер. Какой-нибудь nginx будет гораздо лучше отдавать файлы из FS, чем запрашивать их каждый раз у бекенда, который в свою очередь полезет за ними в базу.
А у всяких Tumblr, наверняка, есть свои системы отдачи контента, или же банальный кэш в памяти, или в той же FS перед веб-сервером. Но нужны ли эти слои ТС?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Anton Batenev, Вы писали:
AB>Там речь шла про пару сотен MB. Если же говорить про большой объем/число файлов, то тогда в распределенной ФС.
Пара сотен МБ файлов, если у них размеры в единицы КБ — это дофига для одной директории, так что идея раскидать по разным очень здравая.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, sushko, Вы писали:
S>У меня есть десктопный проект (win32/C++/MFC), в котором информация может снабжаться картинками; картинки при этом хранятся в базе данных в BLOB-полях. БД без картинок занимает примерно 3-15 мегабайт, с картинками — сотню-полторы мегабайт; баз данных крупнее 700MB я у пользователей не видел. Я не замечал, чтобы наличие картинок в БД как-то замедляло работу программы.
S>Сейчас хочу вынести часть этого проекта в веб: php+mysql. Скажите, где правильно будет хранить картинки, в базе данных или в отдельной папке на сервере?
У базы есть определенные приемущества:
— транзакционность, совместный доступ из коробки.
— бэкапы
— удобный деплоймент
— минимальные изменения относительно текущей системы
По поводу производительности Microsoft исследование проводила как-то (гуглится), про свой SQL Server и NTFS, которое показало, что при размере файла менее 256кб выигрывает база, а при размере больше 1мб — файловая система.
Здравствуйте, sushko, Вы писали:
S>У меня есть десктопный проект (win32/C++/MFC), в котором информация может снабжаться картинками; картинки при этом хранятся в базе данных в BLOB-полях. БД без картинок занимает примерно 3-15 мегабайт, с картинками — сотню-полторы мегабайт; баз данных крупнее 700MB я у пользователей не видел. Я не замечал, чтобы наличие картинок в БД как-то замедляло работу программы.
S>Сейчас хочу вынести часть этого проекта в веб: php+mysql. Скажите, где правильно будет хранить картинки, в базе данных или в отдельной папке на сервере?
Для картинок если данные редко удаляются (при удалении удаляются только запись в бд), то хорошо использовать индексный файл. Яндекс так делает.
Здравствуйте, Anton Batenev, Вы писали:
AB>чем больше файлов в директории, тем больше времени будет тратиться на поиск. Оптимально будет раскидать большое число файлов на 1-2 уровня вложенных директорий.
А что такое "большое количество файлов"? Какое количество файлов в директории можно считать приемлемым? Ну, скажем, 3-5 тысяч файлов — это приемлемо?
Здравствуйте, sushko, Вы писали:
s> AB>чем больше файлов в директории, тем больше времени будет тратиться на поиск. Оптимально будет раскидать большое число файлов на 1-2 уровня вложенных директорий. s> А что такое "большое количество файлов"? Какое количество файлов в директории можно считать приемлемым? Ну, скажем, 3-5 тысяч файлов — это приемлемо?
Если меня не подводит память, то readdir под капотом дергает getdents с буфером в 32768. Т.е. верхняя граница, после которой в общем случае начнется "пенальти", должна быть где-то около этой цифры.
Здравствуйте, Anton Batenev, Вы писали:
AB>Если меня не подводит память, то readdir под капотом дергает getdents с буфером в 32768. Т.е. верхняя граница, после которой в общем случае начнется "пенальти", должна быть где-то около этой цифры.