Как использовать zlib для сжатия потока файлов на лету в ruby - PullRequest
0 голосов
/ 29 декабря 2011

Я бы хотел обернуть обычный файл таким образом, чтобы чтение из него (кусками) давало сжатые данные.

в настоящее время:

f = File.open(name)

while(string = f.read(@chunk_size) {
    <do something>
}

Как бы я использовал Zlib, чтобы f.read возвращал @chunk_size сжатых данных?

Я нашел пример, подобный приведенному ниже, где можно использовать 'str', но он полагается на одновременное чтение всего файла, что невозможно, поскольку это может быть очень большой файл.

str = StringIO.new()
gz = Zlib::GzipWriter.new(str)
gz.write File.read('local-file.txt')
gz.close

str.string.read(@chunk_size)

спасибо

UPDATE:

Кажется, этот хак работает, но я уверен, что он может быть оснащен Zlib:

f = File.popen("/bin/gzip < #{name}" )

изучает, как делать с Zlib ..

1 Ответ

0 голосов
/ 29 декабря 2011

Если данные в файле находятся в отдельных строках, вы можете использовать метод итератора each_line ()

f = File.new('somefile.txt', 'r')
f.each_line do |line|
  <The compression and storage part>
end

Возможно, это уже могло произойти с вами.

...