Zstd: Unterschiede zwischen gzip und zstd

Erstellt am 19. Sept. 2017  ·  4Kommentare  ·  Quelle: facebook/zstd

zstd unter Linux: zwei Beobachtungen

1) Wenn ich gzip starte, um eine große Datei zu komprimieren, und wenn ich gzip mit ^ C beende, löscht gzip die Ausgabedatei vor dem Beenden. zstd tut das derzeit nicht. Ich denke, das Verhalten von gzip ist besser, weil es besser ist, keine Ausgabedatei zu haben, als eine unvollständige oder beschädigte Ausgabedatei.

2) Beim Komprimieren oder Dekomprimieren einer Datei verwendet zstd den folgenden Systemaufruf, um die Ausgabedatei (von strace) zu erstellen:
open("file.zst", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
gzip und xz verwenden ähnliche Systemaufrufe, verwenden jedoch den Modus 0600. Sie schalten den Modus der Ausgabedatei auf den gewünschten Modus um, nachdem die Datei geschlossen wurde. Gibt es einen Grund, warum zstd 0666 verwendet? Ich denke, 0600 wäre besser: Erlaube anderen Benutzern keinen Lesezugriff, bevor die Datei fertig ist.

feature request question

Alle 4 Kommentare

  1. Das Abfangen des ^C Ereignisses erfordert einen Signalhandler. Ich habe mich noch nicht darum gekümmert. Ich mache mir auch Sorgen um die Portabilität.

  2. Ihre Spur ist genauer als unser Code.
    Der Aufruf zum Öffnen der Zieldatei ist hier:
    https://github.com/facebook/zstd/blob/dev/programs/fileio.c#L324
    Es ist nur ein Standard fopen("name", "wb"); , wir kontrollieren kein Eigenschaftsbit.
    Es wird zufällig in diesem Trace auf Ihrem System übersetzt, wissen Sie nur, dass wir keine Kontrolle darüber haben.
    Im Allgemeinen versuchen wir aus Gründen der Portabilität (und der Reduzierung von Abhängigkeitskopfschmerzen) so nah wie möglich am Standard C zu bleiben.

Zunächst einmal: danke, dass du zstd geschrieben hast. Ich bin begeistert von Geschwindigkeit und Kompressionsverhältnis! Sehr schön!

Bitte zögern Sie nicht, dieses Ticket zu schließen. Meine beiden Beobachtungen sind nur kleine Trottel und es ist vollkommen in Ordnung, wenn Sie sich entscheiden, nichts zu tun.

  1. Ich bin damit einverstanden, dass für das Einfangen von ^ C ein Signalhandler erforderlich ist.
  2. Interessant. Ich habe mir den Quellcode von xz angesehen und sie öffnen die Ausgabedatei mit dem folgenden Code:
      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 );

Sie verwenden open() anstelle von fopen() - und können somit die Berechtigungsbits der Ausgabedatei steuern.

Richtig, ich glaube, xz zielt auf POSIX konforme Systeme ab.
Daher kann es Posix-Bibliotheken frei verwenden, auf Kosten der Nichtkompatibilität mit Nicht-Posix-Systemen oder der Notwendigkeit benutzerdefinierter Wrapper (Windows kommt mir in den Sinn).

zstd versucht so weit wie möglich Standard-C zu sein, um die Portabilitätsperspektiven zu verbessern.

Technisch verwenden wir gelegentlich auch einige OS-abhängige Schnittstellen, wenn es kein Standard-C-Äquivalent gibt. In diesem Fall versuchen wir, mehrere Varianten zu schreiben, um mehrere Ziele zu unterstützen. Bei nicht unterstützten Zielen werden relevante Funktionen sauber deaktiviert (sie sind in der Regel nicht unbedingt erforderlich).

Nachdem Sie ein bisschen mehr darüber erfahren haben, scheint es, dass die Funktion signal() tatsächlich Teil von Standard C ist , was es ziemlich gut portabel macht.

Im letzten dev Filial-Update habe ich Ctrl-C Trapping zu zstd cli hinzugefügt.
Beim Drücken von Ctrl-C löscht es jetzt das Operationsartefakt (unfertige Zieldatei) vor dem Beenden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

vade picture vade  ·  3Kommentare

escalade picture escalade  ·  3Kommentare

itsnotvalid picture itsnotvalid  ·  3Kommentare

planet36 picture planet36  ·  3Kommentare

ga92yup picture ga92yup  ·  3Kommentare