Výstup ke skriptu rovnou do 7z ke kompresi

Výstup ke skriptu rovnou do 7z ke kompresi
« kdy: 02. 12. 2017, 16:36:05 »
Snazim se vymyslet, jak pajpou presmerovat vystup ze skriptu.

Mam vystup ze skriptu, ktery jde do textoveho souboru. Jde mi o to, abych mohl ten vyskyp pajpou presmerovat primo ke komprimaci pomoci 7z, bez toho, aby se vystup ukladal na disk. (on je ten vystup docela velky). Zatim se mi to nepovedlo.

Aktualne:
./Skript.sh >> Vystup.txt
7z a -t7z -m0=lzma2 -mqs -mx=9 -mfb=273 -md=1024m -ms=on -ms=65536g -mmt=2 Archiv.7z

chtel bych to udelat takto:
./Skript.sh | 7z a -t7z -m0=lzma2 -mqs -mx=9 -mfb=273 -md=1024m -ms=on -ms=65536g -mmt=2 Archiv.7z

Nebo:
PROCES | 7z a -t7z -m0=lzma2 -mqs -mx=9 -mfb=273 -md=1024m -ms=on -ms=65536g -mmt=2 Archiv.7z

Jak to primo pajpovat, se mi nepodarilo.
« Poslední změna: 03. 12. 2017, 20:15:33 od Petr Krčmář »


JirkaP

Re:Jak presmerovat vystup ke skriptu rovnou do 7z aby se komprimoval
« Odpověď #1 kdy: 02. 12. 2017, 16:52:46 »
v manulaovych strankach mas:
-si    Read data from StdIn (eg: tar cf - directory | 7z a -si directory.tar.7z)

takze, nezkousel jsem vsechny tvoje prepinace, ale jednoduchy test dela co ma..
cat file.txt | 7z a -si file.7z

je to ono ?

olio

Re:Jak presmerovat vystup ke skriptu rovnou do 7z aby se komprimoval
« Odpověď #2 kdy: 02. 12. 2017, 18:21:48 »
Ale tam přece bude problém s tím, že klasický způsob komprese počítá s tím, že vidí celý soubor najednou a může podle toho koprimovat. Tady se musí komprimovat po nějakých částech, ale umí to 7z?

nobody(ten pravej)

Re:Jak presmerovat vystup ke skriptu rovnou do 7z aby se komprimoval
« Odpověď #3 kdy: 02. 12. 2017, 19:16:35 »
[...] ale umí to 7z?
pokud by to neumelo tak preci nema v manualu volbu pro cteni dat z stdin ;-)

ollo

Re:Jak presmerovat vystup ke skriptu rovnou do 7z aby se komprimoval
« Odpověď #4 kdy: 02. 12. 2017, 22:28:56 »
Jasně, to sice umí, ale bude to fungovat stejným způsobem? Nemůže to mít horší kompresní výsledky? Nebo to má nějaké parametry jako velikost bloku nebo maximální alokovaná paměť v režim proudového zpracování oproti, když to má celý soubor na nereZZovém táci?


Tomas2

  • ****
  • 310
    • Zobrazit profil
    • E-mail
Re:Jak presmerovat vystup ke skriptu rovnou do 7z aby se komprimoval
« Odpověď #5 kdy: 03. 12. 2017, 00:03:26 »
řešit celý soubor na jednou pro komprimaci je dost drahé,  v krajních případech se setkávám s max. 1GB bloky.

7z komprimuje jednotlivé blocky, jejich nastavení je právě ta řada divných argumentů v samotném dotazu, moc sice optimálně nastavené nejsou, ale neznám HW, objem dat atd.

ByCzech

  • *****
  • 1 861
    • Zobrazit profil
    • E-mail
Re:Jak presmerovat vystup ke skriptu rovnou do 7z aby se komprimoval
« Odpověď #6 kdy: 03. 12. 2017, 00:40:15 »
On @olio se IMO chtěl vyjádřit ke kompletním META datům o souboru, včetně jeho názvu, délky ap. a nedokázal/nedokáže si představit, že to umí fungovat i jinak a v tom je ten problém.

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Jak presmerovat vystup ke skriptu rovnou do 7z aby se komprimoval
« Odpověď #7 kdy: 03. 12. 2017, 01:14:28 »
Jasně, to sice umí, ale bude to fungovat stejným způsobem? Nemůže to mít horší kompresní výsledky? Nebo to má nějaké parametry jako velikost bloku nebo maximální alokovaná paměť v režim proudového zpracování oproti, když to má celý soubor na nereZZovém táci?

Jezismarja, tak si to otestuj. Narvy vystup do souboru, pak ho nacatuj do 7z a pak si to zkomprimuj jako soubor. Oboji se stejnymi prepinaci, krome prepinace -si.

Re:Jak presmerovat vystup ke skriptu rovnou do 7z aby se komprimoval
« Odpověď #8 kdy: 03. 12. 2017, 22:23:53 »
v manulaovych strankach mas:
-si    Read data from StdIn (eg: tar cf - directory | 7z a -si directory.tar.7z)

takze, nezkousel jsem vsechny tvoje prepinace, ale jednoduchy test dela co ma..
cat file.txt | 7z a -si file.7z

je to ono ?

Diky, funkuje to

Tohle se mi najit nepodarilo predtim

Re:Jak presmerovat vystup ke skriptu rovnou do 7z aby se komprimoval
« Odpověď #9 kdy: 03. 12. 2017, 22:27:55 »
Jasně, to sice umí, ale bude to fungovat stejným způsobem? Nemůže to mít horší kompresní výsledky? Nebo to má nějaké parametry jako velikost bloku nebo maximální alokovaná paměť v režim proudového zpracování oproti, když to má celý soubor na nereZZovém táci?

Cely soubor do pameti nenarve, pokud je velky, jen velikost bloku-slovniku. Ta se da nastavit od 2 nebo 4 MB az do 1536 MB (diskretni hodnoty). Problem je, ze to spotrebuje cca 11-narobek RAM, tedy pri maximalnim slovniku, velikosti bloku 1536 MB to sezere 16.5 GB RAM cca (a pokud se komprimuje hodne souboru, jeste se naroky zvysi cca 0.5-2 GB RAM na milion souboru).

Re:Jak presmerovat vystup ke skriptu rovnou do 7z aby se komprimoval
« Odpověď #10 kdy: 03. 12. 2017, 22:40:22 »
7z komprimuje jednotlivé blocky, jejich nastavení je právě ta řada divných argumentů v samotném dotazu, moc sice optimálně nastavené nejsou, ale neznám HW, objem dat atd.

Je to nastavene na nejlepsi moznou kopresi, optimalnejsi zpusob jsem nenasel. Pravda, je to pomale. Velikost slovniku je parametr -md a velikost bloku (coz nevim co presne ma namysli) se da nastavit podstatne vetsi, aby byl libovolne velky archiv jako jeden blok (-ms).
Ale tady se blok rozumi velikost slovniku -md, coz velikosti bloku, do kterych je archiv rozdelen, odpovida.
-mmt je multithreating, kolik vlaken procesoru se pouzije. Problem je, ze ja jeden slovnik lze pouzit max. 2 vlakna, s kazdou zapocatou dvojici vlaken se musi do pameti paralelne alokovat slovnik. Pokud das -mmt=on, alokuje si to vsechny dostupna vlakna CPU (multi-threating jde jen u lzma2, u lzma ne). Kombinace -md=1536m -mmt=16 znamena, ze potrebujes cca 132 GB RAM, pokud das -mmt=2 nebo -mmt=off, potrebujes 16.5 GB RAM.