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 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).