Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Joskoo 29. 01. 2018, 11:05:08

Název: Embedded App (C) - Database
Přispěvatel: Joskoo 29. 01. 2018, 11:05:08
Ahojte,

Pracujem na projekte pre embedded zariadenia v C, single/multi-thread model, POSIX standard. Prisla potreba ukladania nameranych dat na fyzicke medium.

Data su vo formate bud JSON alebo XML, key/value. Jedna "polozka" dat ma velkost od ~500b do ~3kb, encoding je utf-8. Data su asynchronne prijimane a spracovane, potom by mali byt logovane na fyzicke medium. Takze sa jedna o W operacie, ale kvoli "buducim" zmenam, by bolo vhodne implementovat RW operacie nad DB.
Poloziek je vsehovsudy asi 500/h, zariadenie je aktivne 6h/24h.

Chcem sa vyhnut znovuobjaveniu kolesa, existuje nejaka pekna implementacia v C ktora by mi zabezpecila potrebnu funkcionalitu, ale aby overhead nebol zas prilis velky?
1) SQLite - na takuto potrebu sa mi zdal overhead prilis velky, plny potencial by som nevyuzil...
2) NoSQL, skusil som asi dve implementacie, ale vsehovsudy, 500b zaznam + skoro 4kb junk-u okolo...
3) Napisat si svoju implementaciu v XML/JSON, (asi nebude tak efektivna co do I/O ale nebude az taky moloch...)

Otazka do plena, pozna niekto peknu vhodnu implementaciu na embedded zariadenia?
ktoru z bodov by ste na dany problem pouzili?


diky S.
Název: Re:Embedded App (C) - Database
Přispěvatel: RDa 29. 01. 2018, 11:29:17
Ukladej to do souboru jehoz cesta/nazev bude odvozena od primarniho klice. Nevim proc si komplikovat zivot :)
Název: Re:Embedded App (C) - Database
Přispěvatel: Ivan 29. 01. 2018, 12:54:19
https://en.wikipedia.org/wiki/Sleepycat_Software
Název: Re:Embedded App (C) - Database
Přispěvatel: Tomas2 29. 01. 2018, 18:40:11
sqlite je na tohle přímo ideální, nemusíš použít démonizovanou verzi, ale použít její C knihovny, běžně na tom běžíme. Pokud chceš být hodně minimalista, redis či whitedb, ale ty jsou primáně in-memory.

Sqlite má doboru synergii s ext4 a přes její journaling si umí řešit paralelní zápisy, takže ti může běžet na každém jádru jedna aplikace a ta zapisovat do binárního souboru na disku, co chceš víc? Nosql je proti sqlite velký overhead.
Název: Re:Embedded App (C) - Database
Přispěvatel: ava 30. 01. 2018, 11:21:26
Jestli je to jen jednoduche key-value na disku, tak treba https://en.wikipedia.org/wiki/Berkeley_DB (libdb v debianu)
Název: Re:Embedded App (C) - Database
Přispěvatel: Tomas2 30. 01. 2018, 12:05:22
Jestli je to jen jednoduche key-value na disku, tak treba https://en.wikipedia.org/wiki/Berkeley_DB (libdb v debianu)

Nevíš jak to je teď s její licencí? Co jsem viděl, Oracle to chce zavřít.
Název: Re:Embedded App (C) - Database
Přispěvatel: dddddddd 30. 01. 2018, 13:28:03
Normalne bych pouzil filesystem na sd disku, flash pameti, nebo naprudko ukladat data linearne jako bajty za sebou jako v tar. Mohly sis pridat index na offsety zacinajicich polozek.
Název: Re:Embedded App (C) - Database
Přispěvatel: dddddddd 30. 01. 2018, 13:31:49
Xml/json jsou stromy, co treba compact tree storage, v pameti, ve flash.
Název: Re:Embedded App (C) - Database
Přispěvatel: Tomas2 30. 01. 2018, 19:11:09
dělat to ručně jako doporučuje 8xd je asi ta nejhorší varianta, pokud se něco nepovede, může to vést k poškození dat, chybné konzistenci, má to problém s paralelismem, musíš si ručně udržovat fsync, pokud nechceš nic ztratit, tohle vše již řeší hotové knihovny a je jich celá řada, od zmíněné berkeley db, což je hoodně lehká nadstavba, po těžší ale pořád lehký sqllite, můj oblíbené whitedb, které to ukládá do sdílené paměti či poměrně rád používám na mini projekty tuhle opičárnu https://github.com/simongog/sdsl-lite
Název: Re:Embedded App (C) - Database
Přispěvatel: ava 31. 01. 2018, 10:38:57
Jestli je to jen jednoduche key-value na disku, tak treba https://en.wikipedia.org/wiki/Berkeley_DB (libdb v debianu)

Nevíš jak to je teď s její licencí? Co jsem viděl, Oracle to chce zavřít.

Já nevím, wikipedie tvrdí:

dual licensed (GNU Affero General Public License and commercial permissive license) (version 6.x and upwards)
Sleepycat license (versions 2.0-5.x)
4-clause BSD license (versions 1.x) / JE is licensed under Apache License, Version 2.0.
Název: Re:Embedded App (C) - Database
Přispěvatel: Sten 31. 01. 2018, 10:50:36
Ukladej to do souboru jehoz cesta/nazev bude odvozena od primarniho klice. Nevim proc si komplikovat zivot :)

Taky doporučuji tohle. Souborový systém je také key-value databáze, a pro tak velká data bude ta nejrychlejší.
Název: Re:Embedded App (C) - Database
Přispěvatel: Tomas2 31. 01. 2018, 14:29:32
soubory ve FS nejsou špatné, pokud mi stačí pouze jeden index (název souboru; v tomhle případě asi datum) a pokud souborů nejsou stovky tisíc, miliony, řada nástrojů ze coreutils může mít s tímhle pak problémy (ls je jednovláknové např. a klidně si počkáš 20 min na list na pomalejším zařízení). Na druhou stranu nástroje z coreutils se dají používat pohodlně jako knihovna v C.

Jakmile je ale potřeba soubory prohledávat, upravovat jednotlivé řádky či řešit multivláknový přístup, FS může být zlý pán.

Bez upřesnění zadání lze těžko doporučit správné řešení.
Název: Re:Embedded App (C) - Database
Přispěvatel: Ivan 31. 01. 2018, 16:58:59
soubory ve FS nejsou špatné, pokud mi stačí pouze jeden index (název souboru; v tomhle případě asi datum) a pokud souborů nejsou stovky tisíc, miliony, řada nástrojů ze coreutils může mít s tímhle pak problémy (ls je jednovláknové např. a klidně si počkáš 20 min na list na pomalejším zařízení). Na druhou stranu nástroje z coreutils se dají používat pohodlně jako knihovna v C.

Jakmile je ale potřeba soubory prohledávat, upravovat jednotlivé řádky či řešit multivláknový přístup, FS může být zlý pán.

Bez upřesnění zadání lze těžko doporučit správné řešení.

Jen dodam, ze (pokud se nic nezmenilo), tak linux kernel neumi drzet v buffer cache cast inode adresare. Takze je v pameti bud vse anebo nic. Takze se muze obcas stat, ze bude potreba nahrat z disku cely "index".