12

Tôi muốn có thể thực hiện truy cập ngẫu nhiên vào một tệp được nén. Tôi có thể đủ khả năng để thực hiện một số tiền xử lý (ví dụ, xây dựng một số loại chỉ mục), miễn là kết quả của quá trình tiền xử lý nhỏ hơn nhiều so với bản thân tệp.Truy cập ngẫu nhiên vào luồng gzip

Bạn có lời khuyên nào không?

Suy nghĩ của tôi là:

  • Hack vào một thực hiện gzip hiện có và serialize bang decompressor của nó mỗi, nói, 1 megabyte dữ liệu nén. Sau đó, để thực hiện truy cập ngẫu nhiên, deserialize trạng thái giải nén và đọc từ ranh giới megabyte. Điều này có vẻ khó khăn, đặc biệt là kể từ khi tôi đang làm việc với Java và tôi không thể tìm thấy một thực hiện gzip thuần java: (
  • Nén lại tệp theo khối 1Mb và thực hiện tương tự như trên.
  • Viết trình phân tích cú pháp đơn giản của định dạng gzip không thực hiện giải nén và chỉ phát hiện và lập chỉ mục các ranh giới khối (nếu có bất kỳ khối nào: Tôi chưa đọc mô tả định dạng gzip)

Trả lời

6

có một cái nhìn at this link (mã ví dụ C).

/* zran.c -- example of zlib/gzip stream indexing and random access 
... 

Gzip chỉ là zlib có phong bì.

+0

Cảm ơn, đó là mát mẻ! Nếu tôi chỉ tìm thấy cách để sử dụng nó một cách thoải mái từ Java .. – jkff

+1

@jkff: Nếu bạn không cần triển khai đa nền tảng, hãy kiểm tra JNA. Thật đáng ngạc nhiên khi sử dụng như một cách để gọi các thư viện C. –

+0

Cảm ơn một lần nữa, tôi đã làm như vậy và nó hoạt động như một sự quyến rũ!Rex, cảm ơn bạn: Tôi đã sử dụng JNA :) – jkff

0

câu hỏi thú vị. Tôi không hiểu tại sao lựa chọn thứ 2 của bạn (recompress tập tin trong khối) sẽ tăng gấp đôi không gian đĩa. Dường như với tôi nó sẽ giống nhau, ít hơn một lượng nhỏ trên không. Nếu bạn có quyền kiểm soát phần nén, thì điều đó có vẻ như là ý tưởng đúng.

Có thể ý bạn là bạn không có quyền kiểm soát đầu vào và do đó sẽ tăng gấp đôi.

Nếu bạn có thể làm điều đó, tôi đang tưởng tượng mô hình hóa nó như là một lớp CompressedFileStream sử dụng như cửa hàng sao lưu của nó, một loạt các đốm màu gzip 1mb. Khi đọc, tìm kiếm() trên luồng sẽ chuyển sang đốm màu thích hợp và giải nén. Một Read() qua phần cuối của một đốm màu sẽ làm cho luồng mở ra đốm màu tiếp theo.

ps: GZIP được mô tả trong IETF RFC 1952, nhưng nó sử dụng DEFLATE cho định dạng nén. Sẽ không có lý do gì để sử dụng việc xây dựng GZIP nếu bạn đã triển khai lớp CompressedFileStream này như tôi đã tưởng tượng ra nó.

+0

Tôi không thích tùy chọn thứ 2 vì tôi sẽ không xóa các tệp gốc và tôi không có quyền kiểm soát cách chúng được tạo. Tuy nhiên, bây giờ đó là cách tôi thực sự thực hiện các công cụ (hoàn toàn như bạn mô tả), nhưng tôi không hài lòng với điều đó và đó là lý do tại sao tôi hỏi câu hỏi :) – jkff

3

BGZF định dạng tệp, tương thích với GZIP được phát triển bởi các nhà sinh vật học.

(...) Ưu điểm của BGZF qua gzip thường là BGZF cho phép tìm kiếm mà không cần phải để quét qua toàn bộ tập tin lên đến vị trí đang được tìm kiếm.

Trong http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/, có một cái nhìn tại BlockCompressedOutputStream và BlockCompressedInputStream.java

+2

Cảm ơn, đó là tốt đẹp, nhưng tôi cần công cụ của tôi các tệp nhật ký hiện có và chúng thường được lưu trữ trong tệp .zip hoặc .gzip bởi trình lưu trữ của bên thứ ba. Bên cạnh đó, tôi đã có một giải pháp làm việc :) – jkff

Các vấn đề liên quan