172 похожих чатов

Привет, я собрался свою карманную БД писать на основе Serde+Bincode

и std::fs, сами данные скорее всего будут представлять из себя вектор структур (например юзеров) обёрнутый в RwLock. кстати скажите, имеет ли смысл пытаться оборачивать каждый отдельный элемент вектора в RwLock/Mutex/Refcell (не определился пока), смогу ли я таким образом добиться параллельного доступа к разным данным из моего вектора?

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

в принципе можно, наверное, стараться всё держать в ОЗУ по возможности (я бы хотел реализовать частичную загрузку значений в память) и периодически делать запись всего вектора целиком в файл - таким образом всё должно будет последовательно лежать и не надо париться с разметкой (это если конечно я не упрусь в какие-то ограничения Serde в стиле "нет, чувак, RwLock ты сериализовать не будешь")

правда я пока ещё не знаю, как во фреймворке Rocket сделать систему, которая бы следила за периодической записью на диск значений из БД

22 ответов

13 просмотров

ты что-нибудь слышал о транзакционной целостности? )

Мне кажется, ты вперёд коня бежишь, когда сначала придумываешь имплементацию БД, а потом смотришь, какие проблемы и как она сможет решить. Если сначала поставить цели для БД, а потом от целей продумывать имплементацию, то будет намного проще. Правда, не всегда задачи сразу ясны, так что тут могут быть проблемы, да.

Вадим-Пилот Автор вопроса
Эрик
Мне кажется, ты вперёд коня бежишь, когда сначала ...

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

Вадим Пилот
ну цель у меня просто хранить данные, чем быстрее ...

1) Влезает в память? Если да, то нафиг БД, всё храним в памяти. 2) Нужна ли тебе полноценная БД вообще? Есть вариант взять какой-нибудь flatbuffers и просто на каждом апдейте переписывать весь файл с новым сериализованным рутом. 3) Если БД таки нужна, посмотри, не существует ли нужная БД где-нибудь. NoSQL баз хоть ложкой ешь, там под каждого найдётся своё. 4) Если таки обязательно надо писать самому, то лучше всего посмотреть на то, как реализована какая-нибудь похожая БД. Если похожих совсем нет, то всё равно есть похожие части, например реализация атомарности.

Вадим-Пилот Автор вопроса
Эрик
1) Влезает в память? Если да, то нафиг БД, всё хра...

1) в какой-то момент серверу может понадобиться побыть выключенным (короче надо в ПЗУ записать энивэй) 2) что такое флэтбафферс, где посмотреть про это? 3) ну возможно монгодб, но мне тут интересно самому написать свою БД 4) вроде во время разведки недавно наткнулся на похожее, забыл правда, как называется, но думаю смогу найти снова

Вадим Пилот
1) в какой-то момент серверу может понадобиться по...

>в какой-то момент серверу может понадобиться побыть выключенным Ну тупо совмещаешь пункты 1 и 2 — всё хранишь в памяти, но при запуске читаешь из файла, а при закрытии пишешь в файл; и автосохранения с каким-нибудь гигантским интервалом в минуту можно (нужно) делать.

Эрик
>в какой-то момент серверу может понадобиться побы...

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

ты для общего развития или неиронично планируешь доморощенную бд в проде юзать?

Вадим-Пилот Автор вопроса
Вадим Пилот
ну прод тоже доморощенный так что да

прост я недавно в реальном продакшне потратил порядка 5 человеколет чтобы выпилить такую штуку и заменить на монгу

Вадим-Пилот Автор вопроса
Inspiration Catcher
Лучше SQLite посмотри.

уже был опыт с ним - не понравилось

Вадим Пилот
уже был опыт с ним - не понравилось

если ты серьезно планируешь писать то посмотри на инмемори распространенные: ravendb, tarantool, ...

Вадим-Пилот Автор вопроса
Αλεχ Zhukovsky
если ты серьезно планируешь писать то посмотри на ...

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

Вадим Пилот
нашёл крейт похожий на то, что я хочу реализовать,...

ну 300 звезд это уже скорее всего экономия кучи месяцев работы, даже если подпиливать надо. Если будет недостаточно то поищи биндинги к распространенным популярным решениям вроде тех что я скинул. SQLite например хоть и корявенький но на голову выше самописных приколюх :) Но есть и документные более новые, они могут быть поинтереснее. — В общем, тебе +- формально надо все требования собрать заранее что нужно уметь - тогда и выбор нормальный можно будет сделать. А "погнали там разберемся" - тоже работает, но дорого очень) Можно дешевле, на существующем функционале Ну например: SQlite. почему нет? Что с ним не так? Надо минусы расписать, если они состоят из одного "чет мне не нравица, не знаю чем" то возможно стоит пересмотреть отношение)

Вадим-Пилот Автор вопроса
Αλεχ Zhukovsky
ну 300 звезд это уже скорее всего экономия кучи ме...

кстати дедлайн у меня через несколько дней

Вадим-Пилот Автор вопроса
Αλεχ Zhukovsky
ну 300 звезд это уже скорее всего экономия кучи ме...

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

Вадим Пилот
сикулит, ну я не знаю... это надо под реляционную ...

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

Вадим-Пилот Автор вопроса
Αλεχ Zhukovsky
уязвимостей нет, если берешь ормку (тот же дизель)...

дизель не компилится (не знаю, может я его prerequirments не удовлетворил) да и изучать его отдельно

Вадим Пилот
дизель не компилится (не знаю, может я его prerequ...

изучать тебе нужно 1.5 запроса которые у тебя есть, остальное тебе не нужно. И сами запросы у тебя простые, так што там тоже ничег осложного. На крайняк юзай голвый параметризованный SQL и не учи ничего

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта