C言語関係掲示板

過去ログ

No.1156 popenでgzipを使用する場合

[戻る] [ホームページ]
No.14977

popenでgzipを使用する場合
投稿者---Jum(2004/06/25 16:07:23)


お世話になります。Jumです。

pG = popen( "gzip -9 -c" , "w" );

として、データを圧縮する場合の事なのですが、圧縮されるタイミングがわかりません。

fputs( "長い文字列" , pG );

とする場合に、 fputs で出力された時点で、出力分だけ圧縮されるのか、または popen の
バッファリングによって

fputs( "長い文字列を分割したもの1" , pG );
fputs( "長い文字列を分割したもの2" , pG );
fputs( "長い文字列を分割したもの3" , pG );

とした場合にでも同じ結果になるのかを知りたいのです。
バッファリングされることから考えると

pclose( pG );

とした時に圧縮が開始されるような気もしますが…

以上宜しくお願い致します。


No.14991

Re:popenでgzipを使用する場合
投稿者---tetrapod(2004/06/25 19:15:32)


いつ圧縮がかかるかは gzip の内部のコード次第でしょう。
あるいは送るデータ次第というか。
そんなことを気にしていてはプログラムは書けません。

真のパイプが実装されている OS の場合 (Unix 等)
パイプに送った内容は随時パイプの先に届くので、随時圧縮される。
ニセパイプしかない OS の場合 (pure MS-DOS 等)
pclose したときにパイプ先に届くので、そこまで遅延される。

としか言いようが無いなぁ。

出力が始まるタイミングが pclose まで遅延されるかどうか、
くらいなら気にする価値があるかもしれませんが。



No.15002

Re:popenでgzipを使用する場合
投稿者---Jum(2004/06/26 00:02:02)


ご回答ありがとうございます。

>パイプに送った内容は随時パイプの先に届くので、随時圧縮される。
>pclose したときにパイプ先に届くので、そこまで遅延される。

この違いなのですが、随時圧縮というのが

  fputs( "長い文字列を分割した物1" , pG );
  圧縮
  fputs( "長い文字列を分割した物2" , pG );
  圧縮
  fputs( "長い文字列を分割した物3" , pG );
  圧縮

となるのか

  fputs( "長い文字列を分割した物1" , pG );
  fputs( "長い文字列を分割した物2" , pG );
  fputs( "長い文字列を分割した物3" , pG );
  まとめて圧縮

となるのかで、出来上がるデータが変わると思うのです。
このタイミングを知りたかったのです。

fputs毎に随時圧縮した場合、圧縮率も下がると思いますし…
その辺で悩んでいるというわけなのです…

以上宜しくお願いいたします。


No.15003

Re:popenでgzipを使用する場合
投稿者---επιστημη(2004/06/26 00:05:02)


>fputs毎に随時圧縮した場合、圧縮率も下がると思いますし…
>その辺で悩んでいるというわけなのです…

やってみたらええやんか。と思う。



No.15004

Re:popenでgzipを使用する場合
投稿者---Jum(2004/06/26 00:32:28)


確かに仰るとおりですね。
ということで試してみました。
(と言っても何回か試してはいましたが…)

結果としては、20文字程度の文字を分割してgzipに送り込みましたが
圧縮サイズは同じですが2バイトの相違がありました。

何種類か試した文字列が悪かったのか、同データができあがった場合や
違うデータができた場合があったので、タイミングか?と思ってしまい
質問させていただきました。

分割圧縮と全圧縮では異なることがわかりました。
ありがとうございました。


No.15026

Re:popenでgzipを使用する場合
投稿者---tetrapod(2004/06/28 10:49:20)


>圧縮サイズは同じですが2バイトの相違がありました。
そりゃ当然。 gzip のファイルフォーマット資料を見ましたか?
そこは圧縮元ファイルの日付が入っているところのはずです。
同一データを同一 gzip に与える限り「圧縮されたデータそのものは」
同一になります。(その他周辺データは異なるでしょう)

fputs("abc\nabc\n",f); と fputs("abc\n", f); x2 とで
生成されるファイルの内容が違ったらとんでもないことになりますわい。
# ファイルの日付が違ったら違うファイルぢゃん、ということならば、
# それもまたむべなるかな。