Zstd: Различия между gzip и zstd

Созданный на 19 сент. 2017  ·  4Комментарии  ·  Источник: facebook/zstd

zstd в Linux: два наблюдения

1) Если я запустил gzip, чтобы сжать большой файл, и если я убью gzip с помощью ^ C, 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. Поразила скорость и степень сжатия! Очень хорошо!

Пожалуйста, не стесняйтесь закрыть этот билет. Мои два наблюдения - это всего лишь мелкие придирки, и это нормально, если вы решите ничего не делать.

  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 );

Они используют open () вместо fopen () и, таким образом, могут управлять битами разрешений выходного файла.

Верно, я считаю, что xz нацелен на POSIX совместимые системы,
следовательно, он может свободно использовать библиотеки posix за счет того, что он несовместим с системами, отличными от posix, или требует специальных оболочек (на ум приходит Windows).

zstd старается максимально соответствовать стандарту C , чтобы улучшить перспективы переносимости.

Технически мы также иногда используем некоторые интерфейсы, зависящие от ОС, когда нет эквивалента в стандарте C. В таком случае мы пытаемся написать несколько вариантов для поддержки нескольких целей, а для неподдерживаемых целей соответствующие функции полностью отключены (они, как правило, несущественны).

Узнав об этом немного больше, выясняется, что функция signal() на самом деле является частью стандарта C , что делает ее довольно удобной для переносимости.

В последнем обновлении ветки dev я добавил Ctrl-C trapping в zstd cli.
При нажатии Ctrl-C теперь перед выходом стирается артефакт операции (незавершенный целевой файл).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги