То есть правильно я понял - имя файла соответствует искомому айдишнику? Если я хочу проверить например айди 12345, я вычисляю хэш от него и пытаюсь на диске найти файл с соответствующим именем(хэшем)? А как формируется дерево? Или оно не нужно? Я думал так:
/base/ 10000 10001 10002 20000 20001 20001...
если мне прилетает айди 10010 - я его ищу в каталоге 10000если 22000 - ищу в каталоге 20000и так далее,Или все файлы в одном каталоге?
Тогда я не понимаю как это будет работать.вот есть на диске условно 10 файлов. 1.txt, 2.txt, 3.txt ... мне нужно обратиться системными средствами к нужному каталогу, вычитать все имена файлов в нем - это уже IO операция. Потом для каждого имени получить MD и уже на его основе построить дерево?
классический unordered map
Скорость будет зависеть от глубины ведра (односвязного списка), которая зависит от качества hash-функции определяющей ведро.
В данном случае стоит идти дальше и строить дерево, добиваясь, чтобы в одном файле было не более 1-й строки. Условно брать md5 от имени файла, разбивать по 2 символа и каждый следующий уровень размещать в подкаталоге.
а-ля: MD5 (FileName) = 1e621df39e053ff6bc7db7bb1c616cc1
так мы исключаем возможность "разбухания" каталога на любом уровне ограничив его 256-ю файлами, а доступ к элементу будет осуществляться одним системным вызовом fopen, без всяких последующих хождений по файлам (связным спискам). По сути скорость (за вычетом хеш-функции) обращения сравняется со скоростью открытия сокета для доступа к БД и на порядок обгонит работу с ней.
Мне кажется, ты счас описал NoSQL))) Ну примерно. Но правильно я понял - хэши имен файлов нужно где-то хранить? И тогда постоянно заботиться о целостности?
Естественно. Это не магия, просто готовая оболочка для работы. С кучей возможности. Можно конечно с файлами, но потом - хочу скорости - значит придумываем индексирование/хэшь, хочу параллельность - начинаем извращаться с одновременным доступом, хочу надежность - придумываем транзакции. По мне лучше потратить время продуктивнее. Я не могу годами писать мертворожденный фремфорк)))
Честно - если я для похожего кейса предложу клиенту такое решение - меня наверное уволят одним днем... Обычно мы приходим к тем, у кого такие костыли и чиним) Например работал с медициноской компанией, которая у всех на слуху была в ковидные времена - помогали им обработать сотни миллионов записей с геномами человека в экселе. Сецчас врач загружает результаты анализа, система анализирует и на основе статистики предлагает лекарства и лечение.
Ты, наверное первый, кто приводя пример кода сразу написал про тесты и про эксепшены! дважды респект)))Да, я про такое и говорил, находим файл по маске, открываем, читаем/пишем, закрываем.Вместо того чтобы в 2-х строчках открыть сессию с БД и сделать туда запрос)))
Для меня преимущества БД очевидны для эього кейса
К счастью, у меня таких нет)))
Хочешь сказать что копирование нескольких тысяч файлов будет быстрее?
А заказчик и не должен уметь все это делать - это работа разработчика, настроить все так, чтобы клиент даже не думал, что там внутри. С таким подходом он не сможет и забэкапить файлы. О каких больших обьемах ты говоришь - я не понимаю. По факту ТС работает со списками ID. Работая с БД это несколько запросов, очень простых. Примитивные транзакции. С файлами нужно продумать хорошенько иерархию. Типа 100000.txt хранит айдишники до 100000, 200000.txt - до 200000 и тд. То есть я так понимаю, скрипт должен работать с произвольными именами, сначала определять в каком файле искать, открывать его, проверять на соответствие...
Насчет надежности такого метода у меня тоже есть сомнения. Если файл открыт для чтения, а в это время в него будет писаться новый айдишник, что произойдет? У меня нет опыта в таком, а в базе я знаю как это будет работать. Достаточно использовать ACID совместимые БД.
а что по скорости тут?
Просто уточнил, нет придирок, может я не так прочитал)
Ну, в отличие от большинства местных графоманов, у тебя есть знания, вот мне и интересно стало уточнить. Все мы тут развлекаемся, но и учимся) По крайней мере некоторые.
Например? Применительно к задаче? При хранении большого обьема данных, при необходимости быстрого доступа, например по индексу, чем?
Я наверное не понял, Имеешь ввиду что SQLlite не реляционная?
Когда? Как-то все ответы не подтверждены.
Например, если ТС будет хранить данные в NoSQL DB like MongoDB, он получит самый быстрый доступ по хэшу обьекта, остальные способы не сравнятся. Но проиграют по памяти
Просто надо уметь есть))) Например Раклет - запах ужасный, но вкус просто божественный, когда его поджаришь на гриле, польешь им мясо или бутерброд - не оторваться. Или плесневелые сыры - не все они годяться чтобы сразу есть. Мы перестали заморачиваться с фондю - просто кидаешь кружочек жирного камамбера, полив его оливковым маслом с чесноком и рядом порезаный багет французский - под сухое Примитиво Пугла и фильм вечером самое то. А пицца с бурратой? Но вот сыры типа Горгонзолы - действительно гадость для меня.
Вот ты уперся в формат, который устарел и используется все меньше, мне непонятны в принципе мотивации этого.
Непонятна аудитория твоя. Если для программиста - то весь этот огород нафиг не упал, когда есть куча решений, которые придерживаются общепринятых стандартов, хорошо задокументированы, покрыты тестами и есть гарантия что они будут работать долгие годы. Ты 4 года пилишь и даже MVP нет у тебя. Какая гарантия что ты завтра не забросишь и человек что будет делать.
Для пользователя непрограммиста твои решения выглядят как 6-колесный велосипед - ничего не понятно и неудобно. Ему проще уж тильду какую взять.
Ты спрашивал что я полезного сделал? Ну вот например в моем активе есть сервис, в который ты загружаешь документ, например в ПДФ, потом набрасываешь на картинку на экране готовые блоки с формами, - поля ввода, данные, заголовки и прочие и все это потом конвертится в любой удобный формат - пдф, картинку, хтмл... Все предельно просто. И никакой байды. На фронте - Реакт и самописное приложение, которое работает с координатами блоков. REST API используется для сохранения информации в базе. Все понятно, все работает уже два года и денег мне неплохо заплатили за это.
Ты думаешь, что ты первопроходец, но на самом деле мишка в цирке на трехколесном велике, потешающий публику.