Fórumok
Sziasztok,
32 bites mikrochip-en akarok bzip2-vel tömöríteni. Sima zip-re találtam kódot, de annál nagyobb tömörítése kell, ezért a bzip2. Előbbi kb. 37%-ra nyomja le az adatot, utóbbi 16%. Előbbi <2 MB residens mem-et használ futáshoz, utóbbi <8 MB.
Egyetlen szál C forrás fájlt keresek, amelyhez nem kell külön header fájl vagy egyéb lib. Zip-hez van egy ilyen, egy ilyesmit keresek bzip2-hez:
https://paste.ubuntu.com/26539770/
Ötlet? Kösz.
Hozzászólások
Vagy tudnátok-e ajánlani bzip2 helyett valamit, ami beágyazott eszközre van és jobban tömörít? Köszi.
Egyébként megnéztem sok tömörítőt (zpaq, lrzip, xz, zstd stb), de az adat típusomra bzip2 tömörít a legjobban és nagyságrenddel kevesebb memória kell neki.
Ha foleg kitomoritesz, akkor brotli-t erdemes kiprobalnod.
Egyebkent:
https://landley.net/code/micro-bunzip.c
https://landley.net/code/bunzip-4.1.c
Betömörítéshez kellene. Látom pont betömörítéshez nem tett fel kódot az általad linket arc, mert akkor tesztelném majd.
Lesz elég ram-od hozzá?
Ez jó kérdés, lehet hogy nem. 8 MB rezidens mem használatot mértem --best opcióval bzip2-nél, nekem fél megám lesz úgy néz ki, ezért az is kérdés hogy tudom-e limitálni a memória erőforrást a betömörítésnél.
Más algo-t találtam sokat ahol lehet limitálni, sőt pár byte-on túl nem is kell, de azoknál a fenti 1/3 rátájú tömörítés van. Ennél jobban össze akarom nyomni az adatot.
Az adat átalakításával is kísérleteztem, de maradtak az arányok.
https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_…
Időd az van? (vagy a betömörítésnek gyorsnak is kell lennie, mert mondjuk akkuról megy az eszköz)
Tömörítendő adatok titkosak? Nem lehetne feltenni valahova? Lehet hogy egy tömörebb adatstruktúrát kellene kialakítani. Például bzip2 bwt-t használ a könnyebb tömöríthetőség miatt, nálad lehet az segít.
Akksi kímélő kell és majd megnézem, de így lehet hogy kevesebbet fog enni a wifi chip a hosszabb (max +20-30%?) feltöltéssel mint hogy a proci tömörítsen egy nagyot. Tehát valóban, inkább akksit akarok kímélni.
Akkor minél kevesebbet számoljon az a chip!
Egyébként meg vizsgáld meg, hogy nem lehet e egyéb, nem általános tömörítést alkalmazni.
Pl hőmérséklet értéket fölösleges egy byte-on továbbítani, ha lehet 6 vagy 7 biten is ábrázolni (és van egyéb, továbbítandó adat).
Kösz, majd megnézem. Még 1-2 hét míg ki tudom próbálni.
Megneznem a libszl-t (haproxy low memory footprint tomoritoje), hatha.
Szep a forrasa, piszkosul nem ker ramot, es hangyanyival tomorit benabban.
kösz.
Mármint libslz, nem?
+1 :D
Megkérdezhetem, mi lett a vége? Én is hasonló helyzetben vagyok, bár nekem kitömöríteni kellene. A micro-bunzip.c kódot próbáltam, de irdatlan mennyiségű RAM kell neki, így elvetettem. Lett jobb a zip/gzip-nél?
maga a bzip2 algo elegge memoriaigenyes... ha a zlib (zip/gzip) nem eleg akkor megneznem az lzma2-t (xz/7zip) persze tomoriteskor kicsi szotarmeretre kell parameterezni kulonben az is eszi a ramot.
zip/gzip-re egyszem fejlécfájl (egyáltalán nem foglal memóriát): inflate.h (működik zlib headerrel és gzip headerrel is, portolhatósághoz csak a "pb_*" hívásokat kell kivenni az "uncompress()" függvényből).
Egyébként a gyári bzip2 miért nem jó? Ha nagyon akarod, berámolhatod a forrását egyetlen fájlba, simán működik. "cat *.h *.c >bzip2lib.c", aztán szövegszerkesztővel az include-okat kitörlöd, kész.
Ami még esélyes lehet, xz embedded. Ezt használja a Linux is, ez is csak a contexthez foglal memóriát, a kitömörített bufferhez nem (tehát a memóriafoglalása konstans, nem függ az adattól).
betömörítésről szól az egész topic
Tanulj meg olvasni. "Én is hasonló helyzetben vagyok, bár nekem kitömöríteni kellene."
Egyébként meg az összes általam linkelt megoldás rendelkezik betömörítő párral is, csak hát kattintani meg olvasni luxus ugye?
- https://github.com/pfalcon/uzlib/blob/master/examples/tgzip/tgzip.c
- bzip2-nél eleve *.h, *.c volt
- https://github.com/tukaani-project/xz
Egyébként nem értem, minek ezen pörögni, memóriaallokációmentes, zlib API kompatíbilis, inflate/deflate kb 150 SLoC:
Nem túl gyors, de tökéletesen működik és nem foglal memóriát.
Nincsenek csodák, vagy memóriallokációmentes és nem túl tömörített, vagy jól tömörített de RAM igényes. Lehet választani, olyan sosem lesz, hogy nem foglal memóriát de nagyon jól tömörít.
Ha meg még az is feltétel, hogy kímélje az akksit, akkor végképp el kell felejteni minden számolásigényes (jó tömörítési rátájú) algoritmust.
A végéhez: ezt sokan képtelenek megérteni, hogy csodatömörítés nincs, nevezetesen, hogy jól is tömörít, de RAM-ot, CPU-t se kér, stb.. Olyan ez, mint a termékgyártásnál, a minőség, olcsóság, gyors gyártás egymást kizáró szempontok, tömörítésnél is a nagy tömörítési fok, gyorsaság, kis memóriaéhség szintén ilyen. Nem véletlen, hogy ilyen embedded, mikrovezérlős felhasználásnál mindenki zip/gzip/zlib-et használ (és emiatt nem nagyon találni hozzá bzip, xz, lzma libet), nem divatból, hanem ennek nem kell sok memória, meg nem túl nagy a komplexitási szintje. Nyilván cserében a tömörítése se csodálatos, 80-as évek legvégére jellemző, nagyon kora 90-es évekbeli szint.
“The world runs on Excel spreadsheets.” (Dylan Beattie)
A gzip jelenleg megy, de a bzip2 annyival jobban tömörít (130KB helyett 45KB), hogy örültem volna, ha azt tudom gzip helyett használni. A gyári bzip2 kérdést nem értem. Arduino IDE környezetben próbálkozom, és nem találtam egyáltalán bzip2 libet. Eddig egyetlen használható bunzip forrást találtam, a topicban is említett micro-bunzip-et, ami sajnos túl sok memóriát igényelne.
Az xz-embeddedet megnézem, köszönöm.
Par projekthez haszntaltam ezt az mdeflate nevu projektet. Majdnem olyan jo mint a gzip (par %-kal kevesbe hatekony), de a kitotomoriteshez fix memoriamerettel tudsz szamolni (en ugy hasznalom hogy 7k kelljen neki - mert ennyi van - de ez allithato).
Köszönöm, megnéztem, és az én adataimon sem jobb, mint a gzip. Mivel az már megvan, meghagyom. Csak, ha jobbat találok, akkor nyúlok hozzá.
Megnéztem ezt az xz-embedded kódot, és tényleg jónak tűnik. Azonban Arduino környezetben egyetlen felhasználását sem találtam. Arduino libet sem csináltak még belőle. Nem biztos, hogy elég profi vagyok ahhoz, hogy nekem sikerüljön. Már a micro-bunzip is csak úgy fordult le, hogy lib helyett csak a c fájlt tudtam a projektbe tenni. Amúgy maga az xz tényleg nagyon jó. Az én adataimon kb fele akkora tömörített fájlt eredményez, mint a gzip.
Csak cseréld le a kmalloc hívoskat statikusan foglalt struct-okra és kész. Az adatkicsomagoláshoz nem foglal memóriát, csak a kontextushoz.
Persze, hogy a bzip2 jobban tömörít. Az lzma/lzma2/xz még jobban, az zpaq annál is jobban, a paq8 még jobban, és ezeket is veri a cmix, csak ugye nem Arduinora valók. Sőt, még ezeknél is van durvább, de az ott kezdődik, hogy RTX3090, RTX4090 szintű GPU-kon futtatod. Lehetni mindent lehet, kérdés milyen áron, belefér-e a hardvernek, megéri-e.
“The world runs on Excel spreadsheets.” (Dylan Beattie)
Próbáld ki ezt is:
LZMA SDK (Software Development Kit)
Ez sajnos egy trágya, rengeteget szívtam vele, még desktop Linuxra se sikerült lefordítani. MS API only, még multihtreading is kell neki, stb. stb. stb. Arduino-n esélytelennek érzem. Az xz egyénként pontosan ugyanezt az LZMA (egész pontosan LZMA2) algoritmust használja, szóval a tömörítési rátájuk azonos.