Zstd: gzipとzstdの違い

作成日 2017年09月19日  ·  4コメント  ·  ソース: facebook/zstd

Linux 上の zstd: 2 つの観察

1)大きなファイルを圧縮するためにgzipを起動し、^ Cを使用してgzipを強制終了すると、gzipは終了する前に出力ファイルを削除します。 zstdは現在それをしていません。 不完全または破損した出力ファイルを使用するよりも、出力ファイルを使用しない方がよいため、gzipの動作は優れていると思います。

2)ファイルを圧縮または解凍する場合、zstdは以下のシステムコールを使用して(straceから)出力ファイルを作成します。
open("file.zst", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
gzipとxzは同様のシステムコールを使用しますが、モード0600を使用します。ファイルが閉じられた後、出力ファイルのモードを目的のモードに切り替えます。 zstdが0666を使用する理由はありますか? 0600の方が良いと思います。ファイルの準備ができるまで、他のユーザーに読み取りアクセスを許可しないでください。

feature request question

全てのコメント4件

  1. ^Cイベントをトラップするには、シグナルハンドラーが必要です。 まだ調べていません。 移植性の問題も心配です。

  2. あなたのトレースは私たちのコードよりも正確です。
    宛先ファイルを開くための呼び出しは次のとおりです。
    https://github.com/facebook/zstd/blob/dev/programs/fileio.c#L324
    これは単なる標準のfopen("name", "wb"); 、プロパティビットは制御しません。
    それはたまたまあなたのシステムでこのトレースに変換されます、ただ私たちがそれを制御できないことを知っています。
    一般に、移植性の理由(および依存関係の問題の軽減)のために、標準Cに可能な限り近づけるようにしています。

まず第一に:zstdを書いてくれてありがとう。 スピードと圧縮率に驚いています! 非常に素晴らしい!

お気軽にこのチケットを閉じてください。 私の2つの観察結果はほんの小さな問題であり、何もしないことにした場合はまったく問題ありません。

  1. ^ Cをトラップするにはシグナルハンドラが必要であることに同意します。
  2. 面白い。 xzのソースコードを調べたところ、次のコードで出力ファイルが開かれました。
      int flags = O_WRONLY | O_BINARY | O_NOCTTY | O_CREAT | O_EXCL;
      #ifndef TUKLIB_DOSLIKE
          flags |= O_NONBLOCK;
      #endif
      const mode_t mode = S_IRUSR | S_IWUSR;
      dest_fd = open( dest_name, flags, mode );

fopen()の代わりにopen()を使用するため、出力ファイルのパーミッションビットを制御できます。

そうです、 xzPOSIX準拠のシステムをターゲットにしていると思います。
したがって、非posixシステムとの互換性がないか、カスタムラッパーが必要になるという犠牲を払って、 posixライブラリを自由に使用できます(Windowsが思い浮かびます)。

zstdは、移植性の観点を改善するために、可能な限り標準Cになるように努めています。

技術的には、標準Cに相当するものがない場合、OSに依存するインターフェイスを使用することもあります。 そのような場合、複数のターゲットをサポートするためにいくつかのバリアントを作成しようとします。サポートされていないものについては、関連する機能がきれいに無効にされます (これらは必須ではない傾向があります)。

それについてもう少し学んだ後、関数signal()は実際には標準Cの一部であるように見えます。これにより、かなり移植性が高くなります。

最新のdevブランチの更新では、 Ctrl-Cトラップをzstd cliに追加しました。
Ctrl-C押すと、終了する前に操作アーティファクト (未完了の宛先ファイル) が消去されるようになりました。

このページは役に立ちましたか?
0 / 5 - 0 評価