【gzip】圧縮対決【bzip2】

■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin2008/06/28(土) 12:02:14ID:yqbrlAKF
さあ語れ!

0035login:Penguin2009/06/13(土) 10:03:53ID:0tnCgkV1
>>34
それは書こうかと思ったけどまだ新しすぎるよな・・って思って普及してきてるに止めた。
7zipとしてWindowsでかなり有名なんじゃないかと。

elinksか何かがgzip,deflate以外にbzip2,lzmaが使えたと思うが
ネットでは対応サーバーが皆無だわな

0036login:Penguin2009/06/13(土) 14:34:22ID:QBNkjNcg
いつの間にかgnu tarがlzmaに対応してるな。
dpkgの依存にlzmaが入っていたりもするし、そろそろlzmaが入ってない環境っていうのは珍しいくらいなのかも。

0037login:Penguin2009/06/13(土) 14:54:01ID:pu4qsGER
dpkgでほほぅ、と思ったがtarもか。
〜1GhzのCPUでは結構しんどい仕事だから標準をどうするかは難しそう

0038login:Penguin2009/06/13(土) 17:07:22ID:anrCvK7u
>>33
lzmaは解凍にメモリを多く使うんじゃなかたっけか
それで使いにくいんじゃないかなぁ

0039login:Penguin2009/06/13(土) 22:56:07ID:5NJGz6mZ
ファイルサイズとMD5メモしておけば、
そのうち元のファイルが復元できると言い張る奴がいたな

0040login:Penguin2009/06/14(日) 00:35:26ID:d8gKzCk8
ファイルで思い出したが、 file(1)では、まだlzma形式を認識できないようだ
少なくとも file-5.00 は。

0041login:Penguin2009/06/14(日) 20:53:33ID:Mb+BA8Wb
>>35
こんなのがあった。
p7zipでWindows用の自己解凍アーカイブを作成
ttp://www.commandlinefu.com/commands/view/1402/create-a-self-extracting-archive-for-win32-using-7-zip
cat /path/to/7z.sfx /path/to/archive > archive.exe

0042login:Penguin2009/06/22(月) 15:09:23ID:nPX8bYX0
xz

0043login:Penguin2009/10/16(金) 21:16:27ID:zxtkfFrH
>>41
へぇー。
でも.exeってウィルス疑惑で忌避される傾向にある気がする。

0044login:Penguin2009/11/01(日) 16:47:53ID:jDaGKrnO
自己解凍exeは不安なのに
解凍したzip中のexeは普通に開く不思議

0045login:Penguin2010/05/22(土) 18:22:29ID:RMv2w9HG
lzfかなりいいね。圧縮率に目をつぶれば。
lzoイラネ。

ホントはbzip2系が画像圧縮で有利な技術だから使いたいんだけど、
展開が遅いのがねー。

0046login:Penguin2010/05/23(日) 10:18:27ID:JQh/i7Pu
https://issues.apache.org/jira/browse/AVRO-135
java中心でもいろいろ議論あって面白いなあ

0047login:Penguin2010/05/26(水) 11:51:58ID:zj479Z71
gnuのソースやlinuxの起動イメージも
lzmaになってきたな
復元は圧縮より速いんだっけ

0048login:Penguin2010/05/27(木) 02:45:52ID:BLNLE82C
bzip2 は展開が遅いから、さっさと lzma 系のどれかに置き換わって欲しいな。

0049login:Penguin2010/05/27(木) 11:08:09ID:tOxkqDtJ
>>48
gzipと違って展開プログラムがアセンブラ化されてないからねぇ。
実装としては枯れてるんだからあとは移植するだけなんだが。

0050login:Penguin2010/06/05(土) 23:40:55ID:W7vixxeb
追記。bzip2のデコード分のソースコードを追っかけてみたら、
巨大なswitch文がある関数の中と外を膨大な回数行き来するような構造になってた。
VS2010で最大限の最適化をかけてasmを吐き出してみたけどほとんど最適化されてない。
これを逐語的にハンドアセンブルするのはかなり骨だろうなー。

0051login:Penguin2010/07/23(金) 08:23:17ID:+OeBNNzx
はやくなあれ〜

0052login:Penguin2011/10/27(木) 19:56:40.98ID:TsQJCJm5
xz 試してみたけどいいね
古いマシンだとcpu もメモリも辛いけど

0053login:Penguin2012/08/05(日) 14:48:46.70ID:wvwj6mGz
あげ

0054login:Penguin2012/08/05(日) 21:33:40.19ID:ePcBmGmt
>>52
圧縮率最高だよ
圧縮はかなり遅いが展開は速い

0055login:Penguin2012/09/05(水) 19:03:08.80ID:WD3p9IgW
$ lzma -h

lzma 9.22 Copyright (C) 2006 Ville Koskinen
Based on LZMA SDK 9.22 Copyright (C) 1999-2011 Igor Pavlov

Usage: lzma [flags and input files in any order]
-c --stdout output to standard output
-d --decompress force decompression
-z --compress force compression
-k --keep keep (don't delete) input files
-f --force force overwrite of output file and compress links
-t --test test compressed file integrity
-S .suf --suffix .suf use suffix .suf on compressed files
-q --quiet suppress error messages
-v --verbose be verbose
-h --help print this message
-L --license display the license information
-V --version display version numbers of LZMA SDK and lzma
-1 .. -2 fast compression
-3 .. -9 good to excellent compression. -7 is the default.
--fast alias for -1
--best alias for -9 (usually *not* what you want)

Memory usage depends a lot on the chosen compression mode -1 .. -9.
See the man page lzma(1) for details.

0056login:Penguin2012/09/08(土) 17:36:34.37ID:D8s+KTbM
圧縮・伸張のマルチコア対応ってどうなっているんでしょうね

0057login:Penguin2012/09/19(水) 08:12:29.64ID:CELmho/s
>>56
xzなら-Tでスレッド数を指定できるな。

0058login:Penguin2012/09/19(水) 11:37:55.89ID:VGlr+QY5
>>57
マジで? version教えてくださいな。
こちらは、
xz --version
xz (XZ Utils) 5.1.0alpha
liblzma 5.1.0alpha

0059login:Penguin2013/01/01(火) 21:31:45.52ID:pDNF1piR
誰か教えてちょうだい。
年も明けたことだし去年のログファイルでも圧縮するかと思って、
tar.xz に圧縮してみたんだけど、tar に引数を渡すのに
ディレクトリ名を渡すのと、ファイル名を渡すので
圧縮後のファイルサイズが 3倍くらい違うんだけどなんで?

$ apt-show-versions tar bzip2 gzip xz-utils
bzip2/squeeze uptodate 1.0.5-6+squeeze1
gzip/squeeze uptodate 1.3.12-9
tar/squeeze uptodate 1.23-3
xz-utils/squeeze uptodate 5.0.0-2

# ログファイル数 212、logディレクトリ容量 703MB
$ find log |wc -l
212
$ du -m log
703 log

みたいな環境で、

tar cJf logs_with_dir.tar.xz log
tar cJf logs_without_dir.tar.xz log/*.log

ってそれぞれ実行。

0060592013/01/01(火) 21:32:41.16ID:pDNF1piR
すると、これ↓くらい違っちゃうんだよね。

ls -sh1 *.tar.xz
416K logs_without_dir.tar.xz
1.3M logs_with_dir.tar.xz

$ xz -l logs_*_dir.tar.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 414.7 KiB 702.6 MiB 0.001 CRC64 logs_without_dir.tar.xz
1 1 1,246.3 KiB 702.6 MiB 0.002 CRC64 logs_with_dir.tar.xz
-------------------------------------------------------------------------------
2 2 1,660.9 KiB 1,405.3 MiB 0.001 CRC64 2 files

んで、試しに 7z で圧縮するとこれくらい。
$ 7z a logs.7z log
$ ls -sh1 *.7z
428K logs.7z

なんで?
ちなみに tar.gz や tar.bz2 で試すとほとんど差は出なかった。
何も困ってはいないんだけど不思議なので聞いてみた。

0061login:Penguin2013/01/06(日) 09:47:59.98ID:A9uhtYyK
>>59
> tar cJf logs_with_dir.tar.xz log
> tar cJf logs_without_dir.tar.xz log/*.log

"*.log"以外のファイルやディレクトリがあるんじゃないのか。
前者はlogディレクトリ以下の全てのファイルとディレクトリを対象とするが、
後者はlogディレクトリ以下の"*.log"のみを対象としている。

0062592013/01/06(日) 18:01:23.59ID:zqjwY8tC
>>61
おー、やっと反応があった。

> "*.log"以外のファイルやディレクトリがあるんじゃないのか。
それが logディレクトリ配下には "*.log"しか置いてないのよ。

$ tar tvJf logs_without_dir.tar.xz | wc -l
210
$ tar tvJf logs_with_dir.tar.xz | wc -l
211

1行違うのはディレクトリ自身の分ね。
それに >>60の "xz -l" の結果を見ても、
Uncompressed のサイズはどっちも 702.6 MiB だし。

0063login:Penguin2013/01/07(月) 08:57:09.04ID:N811VClS
ためしに
tar cf - log/*.log|xz > logs_without_dir_pipe.tar.xz
してみるとどう?

0064592013/01/07(月) 18:50:41.98ID:dCQMeIg4
>>63
両方↓やってみた。
$ tar cf - log/*.log|xz > logs_without_dir_pipe.tar.xz
$ tar cf - log|xz > logs_with_dir_pipe.tar.xz

$ ls -sh1 logs_with*_dir_pipe.tar.xz
1.3M logs_with_dir_pipe.tar.xz
416K logs_without_dir_pipe.tar.xz

$ xz -l logs_with*_dir_pipe.tar.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 1,246.3 KiB 702.6 MiB 0.002 CRC64 logs_with_dir_pipe.tar.xz
1 1 414.7 KiB 702.6 MiB 0.001 CRC64 logs_without_dir_pipe.tar.xz
-------------------------------------------------------------------------------
2 2 1,660.9 KiB 1,405.3 MiB 0.001 CRC64 2 files


やっぱり、当たり前と言えば当たり前だけど、結果は同じ。
あんまり関係ないと思うけど、念の為ログの説明しとくと、
hyperestraierインデックス作成時(maildir対象)のログね。
cronで回した際のログなので使用文字列の重複率非常に高し。

0065592013/01/07(月) 19:57:39.25ID:dCQMeIg4
んで、ちょっとテストケースを作ってみた。

mkdir -p /somewhere/test/dir/log
cd /somewhere/test/dir
time for i in $(seq -w 1 1000)
do
for j in $(seq -w 1 2000)
do echo "test log text line ${j}"
done > log/${i}.log
done

$ du -m log
47 log
$ ls log|wc -l
1000

$ tar cf logs_with_dir.tar log
$ tar cf logs_without_dir.tar log/*.log
$ tar czf logs_with_dir.tar.gz log
$ tar czf logs_without_dir.tar.gz log/*.log
$ tar cjf logs_with_dir.tar.bz2 log
$ tar cjf logs_without_dir.tar.bz2 log/*.log
$ tar cJf logs_with_dir.tar.xz log
$ tar cJf logs_without_dir.tar.xz log/*.log

0066592013/01/07(月) 19:58:52.41ID:dCQMeIg4
結果:

$ xz -l logs_with*dir.tar.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 16.9 KiB 46.4 MiB 0.000 CRC64 logs_with_dir.tar.xz
1 1 13.8 KiB 46.4 MiB 0.000 CRC64 logs_without_dir.tar.xz
-------------------------------------------------------------------------------
2 2 30.7 KiB 92.8 MiB 0.000 CRC64 2 files

$ gzip -l logs_with*dir.tar.gz
compressed uncompressed ratio uncompressed_name
5114261 48650240 89.5% logs_with_dir.tar
5114237 48650240 89.5% logs_without_dir.tar
10228498 97300480 89.5% (totals)

※ bzip2 は "-l" オプションなし

$ ls -al logs_with*tar*
-rw-r--r-- 1 hiro hiro 48650240 2013-01-07 10:27 logs_with_dir.tar
-rw-r--r-- 1 hiro hiro 549025 2013-01-07 10:28 logs_with_dir.tar.bz2
-rw-r--r-- 1 hiro hiro 5114261 2013-01-07 10:27 logs_with_dir.tar.gz
-rw-r--r-- 1 hiro hiro 17336 2013-01-07 10:30 logs_with_dir.tar.xz
-rw-r--r-- 1 hiro hiro 48650240 2013-01-07 10:27 logs_without_dir.tar
-rw-r--r-- 1 hiro hiro 543453 2013-01-07 10:30 logs_without_dir.tar.bz2
-rw-r--r-- 1 hiro hiro 5114237 2013-01-07 10:27 logs_without_dir.tar.gz
-rw-r--r-- 1 hiro hiro 14120 2013-01-07 10:31 logs_without_dir.tar.xz

logs_with_dir.tar.xz の方が 1.2倍くらい大きくなる。
三倍も差があるわけじゃないけど、圧縮率の差が大きいのは
やっぱり tar.xzなんだよなぁ。
*.tar 大きさ同じなのになー、やっぱ不思議。

0067login:Penguin2013/01/07(月) 22:40:29.73ID:TM+tkKtJ
そんなに差出なかった
-rw-r--r-- 1 aaa users 5118621 1月 7 22:29 logs_with_dir.tar.gz
-rw-r--r-- 1 aaa users 13828 1月 7 22:24 logs_with_dir.tar.xz
-rw-r--r-- 1 aaa users 13796 1月 7 22:26 logs_without_dir.tar.xz

xzのやつをxz -dで解いた後xz -9で固めたらこうなった
-rw-r--r-- 1 aaa users 48650240 1月 7 22:24 logs_with_dir.tar
-rw-r--r-- 1 aaa users 48650240 1月 7 22:26 logs_without_dir.tar

-rw-r--r-- 1 aaa users 13692 1月 7 22:24 logs_with_dir.tar.xz
-rw-r--r-- 1 aaa users 13584 1月 7 22:26 logs_without_dir.tar.xz

0068592013/01/07(月) 23:56:16.32ID:dCQMeIg4
>>67
むむ、ぬぁにぃぃぃ、こっちの環境のせいなのかぁ?
こっちでも、 xz -d して xz -9 してみた。

-rw-r--r-- 1 hiro hiro 48650240 2013-01-07 23:37 logs_with_dir.tar
-rw-r--r-- 1 hiro hiro 48650240 2013-01-07 23:40 logs_without_dir.tar

-rw-r--r-- 1 hiro hiro 16972 2013-01-07 23:37 logs_with_dir.tar.xz
-rw-r--r-- 1 hiro hiro 13668 2013-01-07 23:40 logs_without_dir.tar.xz

やっぱり 1.2倍くらい違う。
えーと、こっちの環境は debian 6.0.6/squeeze で

$ tar --version
tar (GNU tar) 1.23
$ xz --version
xz (XZ Utils) 5.0.0
liblzma 5.0.0

debian パッケージ的には、

$ apt-show-versions tar xz-utils
tar/squeeze uptodate 1.23-3
xz-utils/squeeze uptodate 5.0.0-2

なんだけど、そっちの環境を教えてもらえますか?

0069672013/01/08(火) 00:05:54.47ID:TM+tkKtJ
Slackware 14.0
tar (GNU tar) 1.26
xz (XZ Utils) 5.0.4
liblzma 5.0.4
だった

0070672013/01/08(火) 00:24:54.72ID:Yi/2g8hy
ひょっとしてと思ってたけど、これ多分メモリの搭載量によって結果変るんだと思う

さっきやったPCでまた新しくデータを作ってからlogs_with_dir.tar.xzを作って
それを別の二台に送って解凍してからまた固めたらこうなった
一番上が最初のPC

Mem: 1165120 696316 468804 0 10940 328680
Mem: 3915520 129536 3785984 0 9660 85404
Mem: 767544 97744 669800 0 15752 67784

-rw-r--r-- 1 aaa users 13908 1月 8 00:09 logs_with_dir.tar.xz
-rw-r--r-- 1 aaa users 13828 1月 8 00:12 logs_with_dir.tar.xz
-rw-r--r-- 1 aaa users 16948 1月 8 00:16 logs_with_dir.tar.xz

xzとtarは全部同じバージョン

0071login:Penguin2013/01/08(火) 00:38:08.97ID:Yi/2g8hy
最後のPCでwithoutのほう試すの忘れて電源切っちゃったけど
多分13800前後になるんだと思う
なんでか分からないけどディレクトリ付きのほうが
圧縮するときメモリ使うってことじゃないかな

0072login:Penguin2013/01/08(火) 00:42:37.31ID:Yi/2g8hy
と適当なこと書いたけどxzやってる間そんなメモリ使ってないな

0073592013/01/08(火) 00:56:31.29ID:5U01eE+J
>>70
おー、そういう検証はとてもありがたい。
しかし Slackwareが出てくるとは…、年季入ってそうっすね。

こっちのメモリは、↓な感じ。
Mem: 3371996 2639292 732704 0 264628 1622812

まさにwithoutの方頼もうと思ってたら、電源切っちゃいましたか…

メモリの使い方については、xz の man pageの "Memory usage"に
いろいろ書いてありますね。
でも、メモリ搭載量で圧縮率に変動があるとしても、元々のお題の
ディレクトリを含む/含まないによって圧縮率が変わることへの
直接の回答にはなっていないような感じ…

んで、今さらながら より新しいバージョンの xz-utilsの
NEWSを見てみたんだけど、

http://git.tukaani.org/?p=xz.git;a=blob;f=NEWS;hb=HEAD
5.0.3 (2011-05-21)
* liblzma fixes:
- lzma_stream_buffer_encode() no longer creates an empty .xz
Block if encoding an empty buffer. Such an empty Block with
LZMA2 data would trigger a bug in 5.0.1 and older (see the
first bullet point in 5.0.2 notes). When releasing 5.0.2,
I thought that no encoder creates this kind of files but
I was wrong.

なんかこれっぽい感じ。
今日はもう寝るけど、明日にでも sid の
新しいバージョンビルドして確認してみよう。

0074672013/01/09(水) 22:44:39.42ID:Q9Cbtgql
>>67のときと同じのを展開した後はこれで
tar cJf logs_with_dir2.tar.xz log
tar cJf logs_without_dir.tar.xz log/*.log

Mem: 767544 97056 670488 0 15600 67276
-rw-r--r-- 1 aaa users 13908 1月 9 22:33 logs_with_dir.tar.xz
-rw-r--r-- 1 aaa users 16948 1月 9 22:36 logs_with_dir2.tar.xz
-rw-r--r-- 1 aaa users 13812 1月 9 22:34 logs_without_dir.tar.xz

Mem: 1165120 359552 805568 0 7776 196436
-rw-r--r-- 1 aaa users 13908 1月 8 00:47 logs_with_dir.tar.xz
-rw-r--r-- 1 aaa users 13828 1月 9 22:35 logs_with_dir2.tar.xz
-rw-r--r-- 1 aaa users 13812 1月 9 22:36 logs_without_dir.tar.xz

同じPCでも今回はサイズが微妙に違った

0075592013/01/14(月) 04:16:03.55ID:ccIYmHSp
明日とか言いつつ、時間たっちゃったな。
てことで xz-utils 5.1.1alpha+20120614 で確認してみた。
なんで 5.0.4じゃないかというと、debian sid に 5.0.4 がなかったから。

試した結果だけど、若干前よりどちらも圧縮率は上がったけど、
圧縮率の差はそのまま。
>>73 の 5.0.3のliblzma fixesは関係なかったみたい。

$ ls -al logs_with*tar*
-rw-r--r-- 1 hiro hiro 16920 2013-01-14 03:54 logs_with_dir.tar.xz
-rw-r--r-- 1 hiro hiro 13836 2013-01-14 03:55 logs_without_dir.tar.xz
$ xz -l logs_with*dir.tar.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 16.5 KiB 46.4 MiB 0.000 CRC64 logs_with_dir.tar.xz
1 1 13.5 KiB 46.4 MiB 0.000 CRC64 logs_without_dir.tar.xz
-------------------------------------------------------------------------------
2 2 30.0 KiB 92.8 MiB 0.000 CRC64 2 files

>>67の人が検証してくれたおかげでとりあえず確認できたのは、
どうやらメモリ環境によって圧縮率は変動するらしいってことくらいか。
確かにそれらしいことが xz の man pageの "Memory usage"に
書かれてるけど、ディレクトリありなしによって圧縮率が変動する
ことの理由にはなってないよなぁ。

てことで、なんかすっきりしないけど、解明はあきらめました。
>>67の人は協力してくれてありがとう。
誰かが xz-utilsのソース読み込んで、
この現象をすっきり説明してくれることを願う。

0076login:Penguin2013/02/20(水) 23:23:26.32ID:TJXl/4x3
pxz

0077login:Penguin2013/04/01(月) 23:37:56.61ID:8w3a7CB+
>>67 >>75
今更だが気になったので実験。
ファイルはGNUのtar-1.26.tar.xzを使用した。

Debian wheezy 7.0
tar 1.26
xz (XZ Utils) 5.1.0alpha
liblzma 5.1.0alpha
Mem: 8104148 2631116 5473032 0 21232 1628468

これをgz,bzip2,xzでそれぞれ -c をつけてリダイレクトして圧縮する。

$ tar -cf tar_with.tar tar-1.26
$ tar -cf tar_without.tar tar-1.26/*
$ du -b * | sort
14899200 tar_with.tar
14899200 tar_without.tar
1763224 tar_without.tar.xz
1788988 tar_with.tar.xz
2348783 tar_without.tar.bz2
2360563 tar_with.tar.bz2
3455923 tar_without.tar.gz
3456187 tar_with.tar.gz

となった。.tarを比較してみる。

$ diff tar_with*.tar
バイナリファイル tar_with.tar とtar_without.tar は異なります

と出力されたのでtarの方に原因があると思われ。
ディレクトリの有無によるファイルサイズの違いについては
xz-utilsよりtarのソースを読んだ方がいいかもしれない。

0078login:Penguin 転載ダメ©2ch.net2015/11/25(水) 09:10:55.17ID:F6DeyhOa
7zipの新バージョンがでたらしいぜ。

0079login:Penguin2015/11/26(木) 08:15:48.68ID:oTJt1TGF
CMIX
http://www.byronknoll.com/cmix.html

圧縮率のためならメモリもCPUも使いまくるというポリシーの実装。
ベンチマークを見ると、30MBのファイルを550kBに圧縮できる代わりに、
メモリ20GBと24分という時間をかけている。
すごいけど推奨メモリ32GBはきつい…

0080login:Penguin2016/01/21(木) 16:01:55.90ID:ZsqpdWQX
BWTのの改良方法考えたんだけど、方法書くから誰かプログラム組んでもらえない?
プログラム起こす人いたら、仕様書きます。

BWTのWikipedia見て思いついたことなので、私の仕様に不備があったら、
プログラム書かなくっても教えてもらえると助かる

0081login:Penguin2017/12/29(金) 15:13:27.11ID:S/CsVkMC
誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。

グーグル検索⇒『宮本のゴウリエセレレ』

EVBFQZKA6L

0082login:Penguin2018/05/22(火) 10:13:07.23ID:Czl6p0FW
僕の知り合いの知り合いができた副業情報ドットコム
関心がある人だけ見てください。
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

V2TCB

0083login:Penguin2018/07/29(日) 06:38:19.85ID:lED4Gqol
おまいら7zとxzは親戚で圧縮率が全く同じだって知ってた?

0084 ◆P0jSlC5fJs 2019/02/03(日) 22:53:26.09ID:XQhFDeeQ
>>83
7zは lzma2 や ppmd などから符号を選べる
lzma2を選択したらxzと同じになる
それだけ

0085login:Penguin2020/01/24(金) 13:08:54.98ID:MCMHsiRW
保守

■ このスレッドは過去ログ倉庫に格納されています