2010-04-12 1 views
2

나는 거대한 파일 (4 기가)에 Zlib :: Deflate.deflate를 사용하려고합니다. 그 일을하는 데 명백한 문제가 있습니다. 그 중 첫 번째는 전체 파일을 한꺼번에 메모리에로드 할 수 없다는 것입니다. 스트림과 함께 작동하기 때문에 Zlib :: GzipWriter가 작동하지만 zlib 압축이 아닙니다. 어떤 아이디어?루비 zlib 방대한 데이터를 수축

답변

3

Zlib :: Stream을 인스턴스화하고 큰 파일 조각에서 데이터를 입력 해보십시오. Zlib :: Deflate :: deflate는 그 일을 배경으로합니다. 그 자체로

z = Zlib::Deflate.new 

File.open "big_uncompressed_file" do |f| 
    File.open "big_compressed_file", "w" do |w| 
    f.each do |str| 
     w << z.deflate str, Zlib::SYNC_FLUSH 
    end 
    end 
end 
z.finish 
z.close 

ruby zlib docs

notes on zlib flush flags

+0

Zlib을 이런 식으로 점진적으로 작동합니까 - 당신이 줄은 점진적으로 데이터의 버퍼링이 압축 된 데이터를 뱉어 :

그것은 다음과 같이 보일 것입니다 . – ConcernedOfTunbridgeWells

+0

big_compressed_file ("w")의 끝에 finish 출력을 원할 수 있습니다. – toothrot

+0

@ConcernedOfTunbridgeWells 'w << z.deflate (str, Zlib :: NO_FLUSH)'? @toothrot 즉,'f.write (z.finish)'? –