2013-04-10 4 views
1

gzip 파일을 읽고 gzip 파일의 일부 (문자열)를 다른 기존 gzip 파일에 추가하려고합니다. 문자열의 크기는 ~ 3000 라인입니다. 나는 이것을 루비에서 여러 번 (~ 10000 번)해야 할 것이다. 이 일을하는 가장 효율적인 방법은 무엇입니까? zlib 라이브러리는 추가 기능을 지원하지 않으며 백틱 (gzip -c orig_gzip >> gzip.gz)을 사용하는 것이 너무 느립니다. 결과 파일은 거대한 텍스트 파일이어야합니다.Ruby의 기존 gzip 파일에 문자열 추가

+0

더 명확하게해야 할 것입니다 ... – squiguy

+0

결과 gzip 파일에 하나의 큰 텍스트 파일 (첨부 된 각 문자열을 텍스트 파일에 연결)을 포함 시킬지, 아니면 많은 수의 작은 파일 추가 된 각 gzip 파일 부분을 나타냅니다. –

+0

하나의 큰 텍스트 파일을 원할 것입니다 –

답변

3

당신이 찾고있는 것이 명확하지 않습니다. 여러 개의 파일을 하나의 gzip 아카이브에 결합하려고하면 그곳에 갈 수 없습니다. Per the gzip documentation :

여러 개의 파일을 하나의 아카이브로 압축 할 수 있습니까?

직접적으로. 당신은 우편, 파워 아카이버 6.1, 7-zip 또는 윈집을 사용할 수 tar cvf - filenames | gzip > file.tar.gz

을 다른 방법 : GNU tar의 : gtar cvzf file.tar.gz filenames 어떤 타르를 위해 당신은 먼저 압축 한 후 tar 파일을 생성 할 수 있습니다. zip 형식을 사용하면 아카이브의 임의의 파일에 임의로 액세스 할 수 있지만 tar.gz 형식은 일반적으로 압축률이 향상됩니다.

아카이브에 추가 할 횟수로 소스를 확장 한 다음 해당 문자열을 단일 파일에 추가 한 다음 필요시 또는 주기로 압축하는 것이 좋습니다.

큰 파일을 갖지만 압축 시간은 빠릅니다.


당신이 모두 확장하지 않고 gzip으로 파일의 데이터가 아닌 별도의 파일을 축적하려는 경우

, 그것은 그러나 당신이 "a" ("추가]"를 지정해야합니다, 기존 GZIP 파일에 추가 할 루비에서 가능) 모드에서 .gzip 파일을 엽니 다. 원본을 유발 할 실패하면 덮어 쓰기합니다 :

require 'zlib' 

File.open('main.gz', 'a') do |main_gz_io| 
    Zlib::GzipWriter.wrap(main_gz_io) do |main_gz| 
    5.times do 
     print '.' 
     main_gz.puts Time.now.to_s 
     sleep 1 
    end 
    end 
end 
puts 'done' 
puts 'viewing output:' 
puts '---------------' 
puts `gunzip -c main.gz` 

어느, 실행할 때, 출력 : 여러 번 사용하면 출력이 증가 볼 수

.....done 
viewing output: 
--------------- 
2013-04-10 12:06:34 -0700 
2013-04-10 12:06:35 -0700 
2013-04-10 12:06:36 -0700 
2013-04-10 12:06:37 -0700 
2013-04-10 12:06:38 -0700 

를 실행합니다.

이 코드가 사용자의 요구에 충분히 빠르든지의 여부는 말하기 어렵습니다. 이 예제는 인위적으로 발을 드래그하여 1 초에 한 번씩 씁니다.

+0

ur help에 감사드립니다. –

+0

http://superuser.com에서 이와 동일한 질문을 할 수 있습니다.보다 효율적인 방법에 대한 좋은 통찰력을 줄 수 있습니다. . –

+0

?? 문제는 여러 파일을 압축 파일로 압축하는 것이 아닙니다. 문제는 (하나의) 압축 된 gzip 스트림에 데이터를 추가하는 것이 었습니다. 타르와 지퍼는 그 질문에 아무런 관련이 없습니다. –

1

추가 된 데이터가 길어서 3000 라인을 gzip 스트림으로 압축하고 기존 gzip 스트림에 추가하기에 충분할만큼 길다는 것 같습니다. gzip은 두 개의 유효한 gzip 스트림이 연결되어 유효한 gzip 스트림이고 gzip 스트림이 두 개의 원래 gzip 스트림의 압축 해제 연결을 압축 해제하는 속성을가집니다.

나는 "(gzip -c orig_gzip >> gzip.gz)이 너무 느린 것 같습니다."라고 이해하지 못합니다. 그것은 가장 빠른 방법 일 것입니다. 압축 시간이 마음에 들지 않으면 압축 수준을 낮출 수 있습니다. gzip -1.

zlib 라이브러리는 저수준 함수가 사용되는 경우 실제로 실제로 지원됩니다. zlib distributionexamples/ directory에 추가되는 gzip의 고급 예제를 볼 수 있습니다.은 단순한 연결보다 압축 측면에서 기존 Gzip 스트림의 압축을 먼저 풀고 이전 스트림이 중단 된 압축을 선택하여보다 효율적으로 추가 할 수 있습니다. gzlog.hgzlog.c은 짧은 메시지를 gzip 스트림에 추가하는 효율적이고 강력한 방법을 제공합니다.

+0

감사합니다. –