2012-05-22 2 views
2

이것은 이론적 인 질문 일 수 있습니다. 나는 큰 파일 (~ 22GB)로 압축이 풀리는 압축 파일 (~ 2GB)이있는 시나리오를 가지고 있습니다. 이 프로세스는 대략 20 분이 걸리며, 이는 다시이 프로세스가 실행될 때마다 약 19 분 59 초를 낭비한다는 것을 의미합니다. 내 질문은 다음과 같습니다 : 압축 해제되는 파일에서 스트림을 열고 데이터를 조작 할 별도의 프로그램으로 정보를 전달할 수 있습니까? 본질적으로 파일의 모든 라인은 레코드이지만 압축 해제 중에 라인이 완전히 디코딩 된 것을 발견하는 기술을 찾을 수 없었습니다. 일반적인 알고리즘이나 Java 라이브러리는 가치가 있습니다.작업자 풀로 전달할 파일 압축 풀기 중 스트림을 열 때 적절한 시간

+0

질문이별로 없습니다. "감압 중에 라인이 완전히 디코딩 된 것을 발견하는 기술을 찾을 수 없었습니다"라는 것은 무엇을 의미합니까? 압축을 풀면 분명히 압축 해제 된 데이터를 얻게됩니다. 따라서 데이터 구조를 알면 레코드가 끝나는 시점을 알 수 있습니다. 또한 나는 "이 프로세스가 실행될 때마다 약 19 분 59 초를 낭비하고있다"는 것을 이해하지 못합니다. 즉, 22 GB의 단일 레코드를 처리하려고 할 때마다 응용 프로그램이 22 GB를 디코딩하는 것입니까? –

+0

@MarkAdler 아니요 단일 레코드를 찾기 위해 압축을 풀고 있지 않습니다.이 프로세스는 몇 시간마다 새로운 데이터로 실행됩니다. 내가 가진 혼란은 감압이 맨 아래로 내려가는가, 아니면 데이터가 무작위로 나오는 곳을 찾는 일종의 일을하는 것인가? – Woot4Moo

+0

압축 풀기는 처음부터 끝까지 순차적으로 작동합니다. 당신이하고 싶은 것이 정확히 무엇입니까? 중간에있는 일부 데이터에 액세스하고 싶습니까? –

답변

3

java.util.zipGZIPInputStream을 사용하여 gzip 파일을 순차적으로 읽을 수 있습니다. 그런 다음 버퍼링을 직접 구현하고 행을 추출하거나 readLine 메서드와 함께 BufferedReader을 사용할 수 있습니다.

3

네, 쉽습니다. 유닉스에서는

bzcat compressedfile.bz2 | mainprogram 

이 그런 다음 메인 프로 그램이 표준 입력에 압축 해제 스트림을 읽을 수 있습니다 할 수 있습니다. 유사한 명령 행 프로그램이 zip 및 gzip 용으로 존재합니다.

주 프로그램이 표준 입력 대신 파일에서 읽어야하는 경우 named pipe을 사용하십시오.

Windows 사용자는 유사한 도구 일 수도 있고 없을 수도 있습니다.

관련 문제