Úložiště vhodné pro embed zařízení

Jan Novák

Úložiště vhodné pro embed zařízení
« kdy: 12. 04. 2013, 20:40:23 »
Ahoj, mám zařízení, které má přes usb napojeno několik různých senzorů k měření různých veličin. Každá veličina má jinou strukturu, např. jedna obsahuje jen jednu hodnotu (například ping), jiná je sadou několika souvisejících hodnot (např. signál - status, typ spojení, kvalita signálu, LAC, CID). Vzorkování probíhá každou vteřinu a naměřené hodnoty posílám k vyhodnocení na server. Avšak zařízení může kdykoli spadnout do offline stavu a tak je potřeba hodnoty ukládat. Aby toho nebylo málo, zařízení může být kdykoli vypnuto od napájení.

Nyní používám SQLite, avšak při delší době offline .db soubor narůstá a občas při snaze zapsat další data narážím na chybu "database locked" a tak musím data uložit do vedlejšího textového souboru. To není úplně šikovné. MySQL není moc vhodné, při vypnutí napájení pak musím řešit rozbité tabulky (MyISAM). Zkoušel jsem CouchDB, které se sice rozbít nedá, ale po zápisu několika tisíc hodnot a následné snaze data vypsat, trvá nesnesitelně dlouho, než se data zaindexují a vypíší. Velikost indexu také není úplně přijatelná - u jiné CouchDB databáze na serveru s 1 milionem záznamů o velikost 1.5 GB je jednoduchý index velký 25 GB. Na zařízení mám k dispozici pouze 1.5 GB, úložiště proto musí být úsporné.

Neměl by, prosím, někdo tip na úložiště, které by spojovalo výhodu CouchDB (nerozbitnost) a MySQL (rychlost zápisu i výpisu uložených hodnot)? Díky předem.
« Poslední změna: 12. 04. 2013, 23:30:15 od Petr Krčmář »


Tomáš P

Re:Výběr vhodného úložiště u embed zařízení
« Odpověď #1 kdy: 12. 04. 2013, 22:58:23 »
Setkal jsem se s :
http://www.firebirdsql.org/
Co vy na to? Jedou na tom celkem velké tabulky autodopravy, tak možná bude OK a přežilo to i pády serveru...

Re:Úložiště vhodné pro embed zařízení
« Odpověď #2 kdy: 12. 04. 2013, 23:38:22 »
MySQL není moc vhodné, při vypnutí napájení pak musím řešit rozbité tabulky (MyISAM).
Když už MySQL, proč MyISAM a ne InnoDB?  A co jiné RDBMS? Postgres?

Nebo já osobně bych vyzkoušel Mnesii pod Erlangem, ale to je samozřejmě jenom pro někoho, kdo Erlang aspoň trochu zná...

JmJ

  • ****
  • 315
    • Zobrazit profil
Re:Úložiště vhodné pro embed zařízení
« Odpověď #3 kdy: 13. 04. 2013, 08:27:35 »
Ja bych problem s database locked nebral jako primy duvod k zahozni sqlite. Podle meho to hovori o tom, ze si spatne ridite pristup k db. Ja bych zkusil hnat zapis do db pres jedno misto, ktere by dovolilo jeden sql prikaz v jeden cas. Tedy zabranil bych paralelnim dotazum. Zkontroloval bych si uvolnovani zdroju. Ale mozna jste vsechno toto udelal a stejne nic.

Ad mysql - na velke mnozstvi dat a rychle dotazy je vhodne jedine myisam. Innodb sice umi transakce a cert vi co jeste, jenze pres veskerou snahu dokaze byt az MNOHOnasobne pomalejsi nez myisam a sqlite. Kdyz uz rozumne zrychlite cteni, tak hromadny zapis je katastrofa.

Pokud data jen ukladate a jednou za cas je vyctete a smazete, tak bych nezhazoval ani hloupy csv soubor. Zapis bez problemu, vycteni je vlastne preneseni souboru. Preneseny soubor smazete a jedete znovu.

pb.

Re:Úložiště vhodné pro embed zařízení
« Odpověď #4 kdy: 13. 04. 2013, 09:09:18 »
1.5 GB na zařízení? To je nějaká SD karta? Pak to udělejte, jak vám napověděl můj předřečník - pokuste se používat Sqlite trochu lépe. Zkuste se podívat na zdrojáky k projektu Fotobot, kde je veškerá databáze řešená z jediného místa a jsou tam i nějaká nastavení pro SD kartu (ať se zbytečně nepřepisuje):

http://www.hobrasoft.cz/cs/fotomon/fotobot

Sqlite3 je naprosto nerozbitná databáze. Nikdy se mi nestalo, že bych Sqlite3 našel po výpadcích rozbouranou. V porovnání s tím byla MySql v podstatně každých čtrnáct dní nedostupná (v tom množství instalací) a co hůře, čas od času NEDĚLALA, co se po ní chtělo a data systematicky až do restartu házela do /dev/null, ačkoliv aplikaci řekla, že update proběhl.


Jan Novák

Re:Úložiště vhodné pro embed zařízení
« Odpověď #5 kdy: 13. 04. 2013, 11:38:36 »
Dobré poledne, moc děkuji za podnětné reakce.

Ad. Firebird a Mnesia: Díky za tipy, už mám zazáložkováno do tabletu na čtení ve vaně ;)

Ad. InnoDB: Dlouhodobě používám MyISAM, neb jsem kdysi kdesi četl, že je nejrychlejší. Transakce ani cizí klíče jsem zatím nikdy nepotřeboval. Naopak fulltext ano. Ale už jsem si načetl nějaké informace a mohlo by to být řešení. Na jednom zařízení vyzkouším, jak se to bude chovat.

Ad. SQLite: Úložiště je aktuálně CF karta. Do db sice ukládám v jednom místě, ale čtení a mazání odeslaných dat dělám v jiném vlákně. Jednotlivé senzory ukládají data do fronty, kterou pravidelně vybírám a data zkouším poslat. Když se to nedaří (jsem offline), uložím je do db. Kolizní bod je v okamžiku, kdy se po delší době offline podaří navázat spojení, čímž se probudí proces, který z db postupně vybírá data a zkusí je poslat. Při mazání odeslaných záznamů se tabulka zamkne a pokud v tu chvíli dojde znovu k výpadku spojení, nelze čerstvě nasbíraná data uložit a musím použít zálohu csv. Posílání čerstvých dat a archivních z db probíhá paralelně ve dvou vláknech.

Tím, že data odesílám každou vteřinu (musí to tak být, nelze si je jen sbírat a poslat třeba jednou za minutu) na nekvalitním spojení, k výpadkům spojení a s tím spojeným uložením dat na lokál dochází poměrně často, v krajních případech i několikrát do minuty. Ale tam vidím ještě prostor v optimalizaci, kdy data za poslední minutu mohu prohlásit za ztratitelná v případě vypnutí napájení a do db je ukládat při výpadku spojení delším, než jedna minuta. Nyní se snažím neztratit ani jeden sebraný záznam.

Díky za všechny postřehy, kolegové tomuto moc neholdují a tak si s nimi na toto téma moc "nepokecám" :)

Re:Úložiště vhodné pro embed zařízení
« Odpověď #6 kdy: 13. 04. 2013, 12:51:42 »
Ad. InnoDB: Dlouhodobě používám MyISAM, neb jsem kdysi kdesi četl, že je nejrychlejší. Transakce ani cizí klíče jsem zatím nikdy nepotřeboval. Naopak fulltext ano. Ale už jsem si načetl nějaké informace a mohlo by to být řešení. Na jednom zařízení vyzkouším, jak se to bude chovat.
Nejsem na DB odborník, ale mám za to (kdyžtak mě prosím opravta), že InnoDB je právě díky těm transakcím málo rozbitná. O samotné transakce teda nejde, jenom o tu nerozbitnost. Ale zas nevím, jestli se po nekorektním vypnutí rozjede sama, neb je potřeba nějaký zásah. Do tohodle moc nevidím, já jsem spíš přes servery a tam děláme co můžeme, aby k nekorektním vypnutím nedocházelo :)

pb.

Re:Úložiště vhodné pro embed zařízení
« Odpověď #7 kdy: 13. 04. 2013, 15:37:41 »
Jestli vám nevadí C++ a Qt, zkuste se podívat do té aplikace, jejíž odkaz jsem posílal. V největší instalaci sbírá jednoduchý počítač postavený na ARM data z 250 zařízení ve čtyřech programově nezávislých vláknech (čtyři sériové porty). Aby se to nehádalo, přistupuje se do databáze z jednoho nezávislého vlákna, přednost má čtení a zápisy chvíli počkají - z vlákna do vlákna se posílají pouze data, která se mají zapsat, a je jedno, jestli se zapíšou ihned, nebo pět vteřin později. Qt je šikovné v tom, že umí řadit signály mezi vlákny do fronty.

neruda

Re:Úložiště vhodné pro embed zařízení
« Odpověď #8 kdy: 15. 04. 2013, 00:59:45 »
jestli tomu spravne rozumim a jen potrebujete ukladat data a paralelne je posilat dal, asi bych taky zvazil primo soubory na filesystem, v jistem smyslu se na nej da divat jako na databazi.