Hello, Vladislav!
On April, 16 2013 at 14:07 you wrote to UAFUG:
??>>>> Собственно, сабж. Конкретнее: вот есть у меня текстовый файл
??>>>> размером в гигабайт, и 10 раз в секунду к нему дописывается
??>>>> ещё по 100 байт (открыли файл, дописали, закрыли). Какой объём
??>>>> будет подвергаться сжатию на ZFS - весь файл; индивидуальные
??>>>> кусочки по 100 байт; хвост файла, находящийся в последнем блоке?
??>>
AY>>> Cow подразумевает обновление только измененного блока плюс того
AY>>> блока где инфа о блоках. Это было бы логично :)
??>>
??>> Дело в том, что у ZFS динамический размер блока, по-умолчанию - от
??>> 512 байт до 128 килобайт. Судя по доке, сжатие происходит только в
??>> том случае, если сжатый кусок файла потом может уместиться в блоке
??>> меньшего размера, чем раньше. И вот тут возникает проблема: если у
??>> нас к файлу добавляются маленькие кусочки (как это обычно бывает с
??>> логами), то очень скоро весь огромный файл будет представлять собой
??>> последовательность сжатых блоков минимального размера. И выигрыш от
??>> сжатия таких блоков тоже будет минимальный.
VP> Как вы себе представляете прибавление к сжатому файлу не сжатого куска?
Ну, этот вопрос уже больше похож на исторический анекдот про схоластов,
которые с мордобоем выясняли, сколько у лошади _должно быть_ зубов. ;-)
Но лично мне самый разумный алгоритм сжатия представляется таким:
1. Считываем последний блок файла и расжимаем его (если он был сжат).
2. Добавляем к нему кусок, который требуется дописать к файлу.
3. Получившийся массив сжимаем.
4. Если в сжатом виде он умещается в размер последнего блока файла -
записываем его и радуемся съэкономленному дисковому пространству.
5. Если не умещается - не трогаем уже сжатый блок, а пытаемся сжать
только тот кусок, что нужно дописать к файлу.
6. Если в сжатом виде он занимает блок размером меньше, чем в несжатом,
то опять же - записываем его и радуемся съэкономленному дисковому
пространству.
7. Иначе - пишем в новый блок несжатый кусок файла. Не повезло. Бывает.
Хорошо, если дописываемый кусок составляет несколько килобайт, тогда он
гарантированно будет сжат на шаге 4 или 6. А вот в случае туевой хучи
маленьких добавлений по 1-2 строчки текста это приведёт к тому, что
последний сжатый блок файла всегда будет минимального размера.
--
WBR, Alexey Markov.