Как буфер, выделяемый gzbuffer, используется в zlib? - PullRequest
0 голосов
/ 02 ноября 2018

Попытка понять, как gzbuffer используется в zlib. Это вырезано из руководства (https://www.zlib.net/manual.html):

ZEXTERN int ZEXPORT gzbuffer OF ((файл gzFile, размер без знака));

Установите размер внутреннего буфера, используемого функциями этой библиотеки. Размер буфера по умолчанию составляет 8192 байта. Эта функция должна вызываться после gzopen () или gzdopen () и перед любыми другими вызовами, которые читают или записывают файл. Выделение буферной памяти всегда откладывается до первого чтения или записи. Три раза этот размер в буферном пространстве выделяется. Больший размер буфера, например, 64 КБ или 128 КБ, заметно увеличит скорость распаковки (чтения).

Новый размер буфера также влияет на максимальную длину для gzprintf ().

gzbuffer () возвращает 0 в случае успеха или –1 в случае неудачи, например, если он вызывается слишком поздно.

Таким образом, размер буфера в три раза больше. Когда я вызываю gzwrite, сжатые данные записываются в буфер (сжатие выполняется при каждом вызове gzwrite) или несжатые данные записываются в буфер? (и затем сжатие задерживается до тех пор, пока буфер не будет заполнен, и gzflush не будет вызван внутренне, или я сам вызову gzflush)

Когда я продолжаю звонить gzwrite, что происходит, когда буфер заполнен? Есть ли какое-то распределение новой буферной памяти на этом этапе или буфер просто сбрасывается в файл и затем используется повторно?

1 Ответ

0 голосов
/ 02 ноября 2018

При чтении выделяется входной буфер size и выделяется буфер вывода 2*size. При написании тоже самое, но в обратном порядке.

Если len меньше size в gzwrite(state, buf, len), то предоставленные данные поступают во входной буфер. Этот входной буфер сжимается после накопления size байтов. Если len больше или равно size, то то, что остается в буфере, сжимается, за которым следуют все предоставленные данные len. Если запрашивается очистка, то все данные во входном буфере сжимаются.

Сжатые данные накапливаются в выходном буфере size, который записывается каждый раз, когда size сжатых байтов накоплено или когда gzFile сбрасывается или закрывается.

...