• ベストアンサー

compressについて

いつもお世話になっております。 素朴な疑問なのですが、compressでファイルを圧縮すると肥大してしまうことがあるのですがなぜなのでしょうか? 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.3

もともと情報量が大きい割りにサイズが小さいファイル (言い換えれば圧縮率が低いファイル) を圧縮すると圧縮によるオーバーヘッドが加わり大きくなってしまうことがあります。 また、compress は Unix でよく使われている gzip や bzip2 などと比べてもかなり圧縮率が悪いのでそういう傾向は出やすい思います。 ちなみに、compress は速度面でも gzip よりも遅いためか Solaris 7 からは高速な zip (Info-ZIP) が標準インストールされるようになり、主として使用されるようになりました。

kakeru_333
質問者

お礼

回答ありがとう御座います。 compressよりgzipの方が遅い気がします。 gzipの方が圧縮率は高いですね。本来の圧縮処理を 優先にしていますので、gzipを試してみようかと思います。 ありがとう御座います。

その他の回答 (2)

回答No.2

アルゴリズムの問題じゃないでしょうか。 もっとも簡単な圧縮の原理は連続するデータを、記号化する事にあります。 たとえば単純に文字列を、文字と連続回数に変換するアルゴリズムの場合。 AAAAA→A5  3バイト圧縮 A→A1    1バイト肥大 となります。 普及してる圧縮アルゴリズムなら肥大する事はそうそうないと思いますが。 JPEG、GIF等のすでに圧縮されているファイルをさらに圧縮しようとすると肥大する可能性はあると思います。

kakeru_333
質問者

お礼

回答ありがとう御座います。 わかり易い説明でした。

  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.1

元のファイルが既にデータ圧縮が行なわれている場合(例えばjpeg形式の画像ファイルなど)には、compressなどにより付帯情報がつく分ファイルサイズが大きくなることはあったかと思います。 (元のファイルよりサイズが大きくなった場合には、元のファイルを残して、compressした一時ファイルのコピーをしない、というような挙動をしたような記憶があるのですが、違ってましたっけ?)

kakeru_333
質問者

お礼

回答ありがとう御座います。 >(元のファイルよりサイズが大きくなった場合には、元のファイルを残して、compressした一時ファイルのコピーをしない、というような挙動をしたような記憶があるのですが、違ってましたっけ?) オプションで-fと記述すると、元のファイルより肥大してしまっても強制的にcompressを実施します。

関連するQ&A

  • solaris7でのcompress

    いつもお世話になっております。 solaris7のcompressコマンドについて質問です。 compressに -f のオプションをつけても、戻り値が2で返ってきてしまいます。(圧縮したファイルが圧縮前のファイルより容量が大きい場合)。 manでcompressコマンドを確認しても、オプションで -f を使用した場合は、戻り値が2で返ってくることはなさそうなんですが・・・・・。 > ls -l file.txt -rw-r--r-- 1 zz001 zz001 0 Mar 24 21:06 file.txt > > compress -cf file.txt > file.txt.Z > > echo $? 2 > > ls -l -rw-r--r-- 1 zz001 zz001 0 Mar 24 21:06 file.txt -rw-r--r-- 1 zz001 zz001 3 Mar 24 22:12 file.txt.Z  ちなみにwhichコマンドで/usr/bin/compressでした。  Solaris8では同様の処理をすると戻り値は0でしたが、どうにもわかりません。solaris7特有の動きなのでしょうか?

  • findとcompressについて

    OSはSolarisを使用しています。Verは2.6か8だと思います。 通常compress命令を使用するとファイルを圧縮できるというのは わかるんです。findが検索するという命令ということも分かっています。 findで検索したファイルを圧縮する命令をUNIXシェルの中に記述したと します。その際にfindで指定したファイルを圧縮するプログラムを作成します。 その時に、指定した条件でファイルが見つからなかった場合に、 compress命令を実行するとプログラムが止まってしまうんです。 通常、UNIXのプロンプト!?よりcompressを実行した場合にで 指定したファイルが存在しない場合には ”ファイルもディレクトリもありません”。と表示されますよね。 圧縮したファイルを指定した場合にも確かメッセージが返ってきた と思います。 ここで質問したいのは3点あります。 1.シェルの中に記述した場合、ファイルが存在しない場合には処理が止まって  しまうのか?(指定したフォルダにファイルが何にも存在しない場合) 2.compressのオプション(-fなど)で、ファイルが存在しなかった場合の  回避はできるのか? 3.その他の方法にてプログラムが止まることの回避はできるのか?  もしくはプログラム上にエラーがあるのか? ぜひ回答よろしくお願いします。

  • compress zip 比較

    compress と zipってどのように違うのでしょうか。 ネット上で色々探したのですが いまいちよくわかりませんでした。 compressは商業用、zipはフリーなのでしょうか。 また、圧縮率に違いなどございましたら、教えていただきたいです。

  • WindowsXPでcompress(Z形式)で圧縮する方法

    テキストデーターをUnixのcompress(Z)の拡張子で圧縮しなくてはいけないのですが、Cygwinにて圧縮を行おうとしたところcompressが存在しないとメッセージが表示されましたzg形式では圧縮出来るのですが、compress(Z)で圧縮しなくてはいけないので、フリーソフト等を探しても解凍ソフトはあるのですが、圧縮ソフトは存在しません。どなたか方法を知っている方がおりましたら教えてください。

  • tarと compressと  remshの組み合わせ

    HP-UXを使用しています。 tar と compress とremshを組み合わせて、 あるディレクトリ配下のファイルを、バックアップし、圧縮し、さらに別サーバに転送したいのです。 例えば、あるディレクトリを /etc/tmpとし、別サーバのIPアドレスをxxx.xxx.xxx.xxxとし、 別サーバの保存領域が/tmpとし、圧縮したバックアップファイル名をdummy.tar.Zとします。 このとき、 下のように打っても、tarのエラーがでます。 具体的には etc/tmp配下にファイルがたくさんあるのにもかかわらずファイルが見つかりませんのようなエラーがでました。 (...のようなというのは、今、家にいるため会社で昼間見たエラーメッセージを覚えていないのです) うってみた内容    tar cvf -etc/tmp | compress -c | remsh xxx.xxx.xxx.xxx dd of=/tmp/dummy.tar.Z  構文が違うのかと思い、いろいろ順序を入れ替え、やってみましたが駄目でした。 しかし、tarとcompressとremshを組み合わせ、対象ファイルをバックアップし、圧縮し、さらに別サーバに転送できると聞いたことがあるのです。(メリットは最初のサーバに大きな容量のバックアップファイルを残さないですむこと)  今日、三時間ほど試しましたが、できませんでした。  もし、皆さんの中でやられた方がいらっしゃいましたら教えてください。

  • AIX kshスクリプトのtar+compressを1行で書く方法について

    こんにちは。はじめまして、hisatoと申します。 AIX kshスクリプトのtar+compressについて 質問がございます。 基本は下記の通りで問題なく完了するのですが、 # アーカイブ処理 tar -cvf - <固める対象のファイル名> | compress >圧縮ファイル名.tar.Z 下記の処理にすると、エラーが発生してしまいます。 tar -cvf - -L <固める対象のファイル名リスト> | compress >圧縮ファイル名.tar.Z tar: 次のフラグにはパラメータが必要です: L 使用方法: tar -{c|r|t|u|x} [-BdFhilmopsvw] [-Number] [-fFile] [-bBlocks] [-S [Feet] [Feet @Density] [Blocksb]] [-LInputList] [-NBlocks] [-C Directory] File ... -Lを使用する場合は、-オプションを使用して新規アーカイブ・ファイルを作成し、 そのアーカイブ・ファイルをcompressに渡すことはできないのでしょうか? 以上、ご教授お願いいたします。

  • ファイルが0バイト以上の時だけcompressしたい

    0バイトのファイルをcompressしようとすると 「ファイルは変更されていません」というメッセージが出ます。 よって、ファイルの容量を見て、0バイト以上の時だけ compressするというシェルを作りたいのですが やり方が分かりません。どうすればよいのでしょう ちなみに、ファイルがあるかどうかは以下でできましたが。 if [ -f ファイル名 ] ; then 処理 ;fi

  • mv処理後の環境変数について

    いつもお世話になっております。 今回は、mv処理後圧縮するということです。 set DIR1 = /tmp set DIR2 = /work mv $DIR1/ファイル1 $DIR2/ファイル1 compress -f $DIR2/ファイル1 としたいのですが、mvで移動したファイル1を 変数設定して圧縮したいのですがどの様に記述きたら 良いでしょうか?

  • Compress:Zlibコンパイルエラー

    Compress::Zlibのコンパイルが出来ずに困っています。 ■ソース展開後のディレクトリにて % perl Makefile.PL Parsing config.in... Building Zlib enabled Looks Good. Up/Downgrade not needed. Checking if your kit is complete... Looks good Writing Makefile for Compress::Zlib ■コンパイル実行(make) mkdir blib (中略) mkdir blib/man3 cp Zlib.pm blib/lib/Compress/Zlib.pm AutoSplitting blib/lib/Compress/Zlib.pm (blib/lib/auto/Compress/Zlib) /usr/local/bin/perl -I/usr/local/lib/perl5/5.00503/sun4-solaris -I/usr/local/lib/perl5/5.00503 /usr/local/lib/perl5/5.00 503/ExtUtils/xsubpp -typemap /usr/local/lib/perl5/5.00503/ExtUtils/typemap -typemap typemap Zlib.xs >xstmp.c && mv xstm p.c Zlib.c gcc -B/usr/ccs/bin/ -c -I./zlib-src -I/usr/local/include -O3 -DVERSION=\"1.38\" -DXS_VERSION=\"1.38\" -fPIC -I/usr/lo cal/lib/perl5/5.00503/sun4-solaris/CORE Zlib.c Zlib.xs: In function `SetGzErrorNo': Zlib.xs:129: parse error before `char' (中略) Zlib.xs:282: `nl' undeclared (first use in this function) gcc: file path prefix `/usr/ccs/bin/' never used make: *** [Zlib.o] Error 1 このエラーが出て、どうしても進めません。 zlibはzlib-1.2.3をインストールしました。 Compress-Zlib-1.38.tar.gzをCPANから取得してインストールしようとすると、上記のエラーとなります。 経験者の方、是非教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 圧縮ファイルの送信時間?

    いつもお世話になります。 素朴な疑問ですが写真の入ったフォルダをメールで 送りましたが2.31MBありますがADSLなので一瞬で送れました。 試しにzipで圧縮してみようかなと思い圧縮しましたが 中身がJPGの写真だけなのでそんなにサイズも変わらず 2.11MBでしたでもメールで送るとものすごく時間がかかります微妙にサイズが小さいのになぜ圧縮すると 10倍以上の時間がかかるのでしょうか?

    • ベストアンサー
    • ADSL