2009-07-25 36 views
35

Tôi muốn mô phỏng chức năng của gzcat | tail -n.Làm thế nào tôi có thể đuôi một tệp nén mà không đọc toàn bộ nội dung của nó?

Điều này sẽ hữu ích cho những lần khi có các tệp lớn (trong vài GB hoặc hơn). Tôi có thể kết thúc một vài dòng cuối cùng của một tập tin như vậy không đọc nó ngay từ đầu? Tôi nghi ngờ rằng điều này sẽ không thể được vì tôi đoán cho gzip, mã hóa sẽ phụ thuộc vào tất cả các văn bản trước đó.

Nhưng tôi vẫn muốn nghe nếu có ai đó đã thử làm điều gì đó tương tự - có thể điều tra về thuật toán nén có thể cung cấp tính năng như vậy.

+0

gzip không phải là văn bản nhưng là nhị phân. Vì vậy, không có "dòng" như trong dữ liệu văn bản mà 'đuôi' có thể trở lại. – Gumbo

+0

Bạn có thể muốn kiểm tra [một câu hỏi tương tự trên SO] (http://stackoverflow.com/questions/14225751/random-access-to-gzipped-files), [Câu hỏi thường gặp zlib] (http://zlib.net /zlib_faq.html#faq28) và [example/zran.c] (https://github.com/madler/zlib/blob/master/examples/zran.c) trong [zlib] (http: // zlib. net) phân phối. –

Trả lời

36

Không, bạn không thể. zipping algorithm hoạt động trên luồng và điều chỉnh các mã nội bộ của nó thành luồng nào chứa để đạt được tỷ lệ nén cao.

Không biết nội dung của luồng trước một thời điểm nhất định, không thể biết cách loại bỏ nén từ điểm đó.

Bất kỳ thuật toán nào cho phép bạn loại bỏ các phần tùy ý của nó sẽ yêu cầu nhiều lần vượt qua dữ liệu để nén nó.

+6

Điều này chỉ đúng một phần, tùy thuộc vào cách tệp được xây dựng. các tệp gzip có thể chứa nhiều luồng, với một luồng sau là hoàn toàn độc lập với các tệp cũ. Bạn chỉ có thể ghép nối các tệp gzip với nhau và vẫn có tệp gzip hợp lệ. Tôi không biết chi tiết, nhưng tôi cho rằng có thể tìm thấy vị trí của lần đặt lại cuối cùng của luồng, giả sử rằng mọi thứ đã viết luồng đều khởi động lại rất thường xuyên. – mc0e

3

Nếu bạn có quyền kiểm soát nội dung trong tệp ở vị trí đầu tiên, nếu có bất kỳ thứ gì như tệp ZIP, bạn có thể lưu trữ các kích thước được xác định trước với tên tệp theo thứ tự tăng dần và sau đó chỉ giải nén tập tin/tệp cuối cùng.

+3

Điều này nghe có vẻ như là một sự thỏa hiệp tốt. Tuy nhiên, OP nên biết rằng điều này sẽ làm giảm tỷ lệ nén. Nếu thử nghiệm cho thấy sự thay đổi tỷ lệ là chấp nhận được, đây là một ý tưởng tuyệt vời. –

+1

Bạn thực sự có thể đạt được điều này bằng cách đặt lại từ điển nén một phần thông qua một tập tin, do đó loại bỏ sự cần thiết phải chia tập tin chính nó thành các khối. –

7

BGZF được sử dụng để tạo tệp nén BAM chỉ mục gzip được tạo bởi Samtools. Đây là những truy cập ngẫu nhiên.

http://samtools.sourceforge.net/

+1

Chính xác. Tuy nhiên, nó không chỉ dành cho samtools hoặc cho BAM! Tôi tin rằng nó sẽ làm việc cho bất kỳ dữ liệu phân cách bằng dòng nào. –

+1

Các tệp BGZF cho phép truy cập vào các khoảng trống byte ngẫu nhiên bên trong gzips được xây dựng đặc biệt bằng cách giới hạn kích thước khối đầu tiên và sau đó cho mỗi khối lưu trữ độ dài của nó trong tiêu đề BC (mà gzip bỏ qua) để cho phép truy cập ngẫu nhiên mà không cần giải nén. Các công cụ như BAM lưu trữ bù đắp bằng cách lưu trữ bù đắp của khối bắt đầu và cũng bù đắp trong khối. Để có được chỉ mục theo định hướng dòng, bạn cần một cái gì đó giống như tệp bai hoặc tabix đi kèm (mặc dù đây là định dạng và bộ gen cụ thể) để ánh xạ từ (các) dòng mong muốn của bạn để bù đắp. –

1

Nếu đó là một lựa chọn, sau đó bzip2 có thể là một thuật toán nén tốt hơn để sử dụng cho mục đích này.

Bzip2 sử dụng lược đồ nén khối. Như vậy, nếu bạn lấy một đoạn cuối của tệp của bạn mà bạn chắc chắn đủ lớn để chứa tất cả đoạn cuối cùng, thì bạn có thể khôi phục nó bằng bzip2recover.

Kích thước khối có thể chọn tại thời điểm tệp được ghi. Thực tế đó là điều xảy ra khi bạn đặt -1 (hoặc - nhanh) thành -9 (hoặc --best) làm tùy chọn nén, tương ứng với kích thước khối từ 100k đến 900k. Giá trị mặc định là 900k.

Công cụ dòng lệnh bzip2 không cung cấp cho bạn một cách thân thiện để làm điều này với một đường ống, nhưng sau đó cho bzip2 không được định hướng luồng, có lẽ điều đó không đáng ngạc nhiên.

1

zindex tạo và truy vấn chỉ mục trên tệp văn bản được nén, dựa trên dòng theo cách hiệu quả theo thời gian và không gian.

https://github.com/mattgodbolt/zindex

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