Sly32

Рейтинг
367
Регистрация
29.03.2012
alexx10 #:

Перед новым годом компании скидывали валюту, чтобы закрыть налоги. К весне курс может повыситься до 100

В биржу сейчас  ежедневно на поддержание курса на бирже сливают валютных ценностей (в основном юани) на сумму 16,7 млрд рублей до конца месяца, потом в районе 15. Надолго хватит? 

chaturanga #:
узнать, есть ли такое имя файла в списке (опять же вычисляем хеш и проверям есть ли такой каталог)

То есть правильно я понял - имя файла соответствует искомому айдишнику? Если я хочу проверить  например айди 12345, я вычисляю  хэш от него и пытаюсь на диске найти файл с соответствующим именем(хэшем)? А как формируется дерево? Или оно не нужно? Я думал так:

 /base/
        10000
                10001
                10002
        20000
                20001
                20001
...

        

если мне прилетает айди 10010 -  я его ищу в каталоге 10000
если 22000 - ищу в каталоге 20000
и так далее,
Или все файлы в одном каталоге?

chaturanga #:
Нет,  хеши вычисляются в момент обращения (чтения/записи)

Тогда я не понимаю как это будет работать.
вот есть на диске условно 10 файлов. 1.txt, 2.txt, 3.txt ... мне нужно обратиться системными средствами к нужному каталогу, вычитать все имена файлов в нем - это уже IO операция.  Потом для каждого  имени получить  MD и уже на его основе построить дерево? 

chaturanga #:

классический unordered map

Скорость будет зависеть от глубины ведра (односвязного списка), которая зависит от качества hash-функции определяющей ведро.

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

а-ля: MD5 (FileName) = 1e621df39e053ff6bc7db7bb1c616cc1

так мы исключаем возможность "разбухания" каталога на любом уровне ограничив его 256-ю файлами, а доступ к элементу будет осуществляться одним системным вызовом fopen, без всяких последующих хождений по файлам (связным спискам). По сути скорость (за вычетом хеш-функции) обращения сравняется со скоростью открытия сокета для доступа к БД и на порядок обгонит работу с ней.

Мне кажется, ты счас описал NoSQL))) Ну примерно. Но правильно я понял - хэши имен файлов нужно где-то хранить? И тогда постоянно заботиться о целостности? 

Shelton724 #:
если залочить - то кто второй - тот подождёт. Да и в целом все БД построены на файлах, там нет никакой мистической другой технологии на принципиальном уровне.

Естественно. Это не магия, просто готовая оболочка для работы. С кучей возможности. Можно конечно с файлами, но потом - хочу скорости - значит придумываем индексирование/хэшь, хочу параллельность - начинаем извращаться с одновременным доступом, хочу надежность - придумываем транзакции. По мне лучше потратить время продуктивнее. Я не могу годами писать мертворожденный фремфорк)))

NoMoreContent #:
Конечно, каждый сделает так, как ему нравится. 

Честно - если я для похожего кейса предложу клиенту такое решение - меня наверное уволят одним днем...  Обычно мы приходим к тем, у кого такие костыли и чиним) Например работал с медициноской компанией, которая у всех на слуху была в ковидные времена - помогали им обработать сотни миллионов записей с геномами человека в экселе. Сецчас врач загружает результаты анализа, система анализирует и на основе статистики предлагает лекарства и лечение. 

NoMoreContent #:
Сюда пишем разные условия, пишем тест для этого кода и прогоняем его на большом объеме ID, проверить не выбрасывается ли Exception.

Ты, наверное первый, кто приводя пример кода сразу написал про тесты и про эксепшены! дважды респект)))
Да, я про такое и говорил, находим файл по маске, открываем, читаем/пишем, закрываем.
Вместо того чтобы в 2-х строчках открыть сессию с БД и сделать туда запрос)))

Для меня преимущества БД очевидны для эього кейса

NoMoreContent #:
И слишком сложны для заказчиков.

К счастью, у меня таких нет)))

NoMoreContent #:
Только ну очень долго разворачиваются из бэкапа

Хочешь сказать что копирование нескольких тысяч файлов будет быстрее?

NoMoreContent #:
Заказчики подобных проектов зачастую не готовы и не умеют работать с БД, которые уже на старте проекта достигают размеров в районе 200-300 Гб. Не могут ни сделать бэкап ни развернуть его.

А заказчик и не должен уметь все это делать - это работа разработчика, настроить все так, чтобы клиент даже не думал, что там внутри. С таким подходом он не сможет и забэкапить файлы. О каких больших обьемах ты говоришь - я не понимаю. По факту ТС работает со списками ID. Работая с БД это несколько запросов, очень простых. Примитивные транзакции. С файлами нужно продумать хорошенько иерархию. Типа 100000.txt хранит айдишники до 100000, 200000.txt - до 200000 и тд. То есть я так понимаю, скрипт должен работать с произвольными именами, сначала определять в каком файле искать, открывать его, проверять на соответствие... 

Насчет надежности такого метода у меня тоже есть сомнения. Если файл открыт для чтения, а в это время в него будет писаться новый айдишник, что произойдет? У меня нет опыта в таком, а в базе я знаю как это будет работать. Достаточно  использовать ACID совместимые БД. 

NoMoreContent #:
Искал бы построчным чтением с брейком в случае нахождения строки.

а что по скорости тут?

NoMoreContent #:
В моём тезисе про SQLite и альтернативы не было противопоставления. Придирка ни о чём. 

Просто уточнил, нет придирок, может я не так прочитал)

NoMoreContent #:
Про подтверждение ответов. 

Ну, в отличие от большинства местных графоманов, у тебя есть знания, вот мне и интересно стало уточнить. Все мы тут развлекаемся, но и учимся) По крайней мере некоторые. 

NoMoreContent #:
Зачастую файл заметно лучше БД

Например? Применительно к задаче? При хранении большого обьема данных, при необходимости быстрого доступа, например по индексу, чем?

NoMoreContent #:
Иногда лучше SQLite, иногда - реляционная СУБД

Я наверное не понял, Имеешь ввиду что SQLlite  не реляционная?

NoMoreContent #:
иногда и не реляционная

Когда? Как-то все ответы не подтверждены.

Например, если ТС будет хранить данные в NoSQL DB like MongoDB, он получит самый быстрый доступ по хэшу обьекта, остальные способы не сравнятся. Но проиграют по памяти

OnOf #:
Все эти сыры вонючие и плесневелые дичь полная. Такое ощущение когда ешь что им кто-то у себя подмышки протерал после месячной экспидиции на эверест. БЭЭЭ. гадость.

Просто надо уметь есть))) Например Раклет - запах ужасный, но вкус просто божественный, когда его поджаришь на гриле, польешь им мясо или бутерброд - не оторваться. Или плесневелые сыры - не все они годяться чтобы сразу есть. Мы перестали заморачиваться с фондю - просто кидаешь кружочек жирного камамбера, полив его оливковым маслом с чесноком и рядом порезаный багет французский - под сухое Примитиво Пугла и фильм вечером самое то. А пицца с бурратой? Но вот сыры типа Горгонзолы - действительно гадость для меня.

Всего: 7118