Apakah ada format kompresi yang mendukung operasi ekor?

12

Saya mencari format kompresi yang mendukung tailed. Berarti Anda tidak perlu membaca seluruh file untuk mendapatkan byte terkompresi X terakhir. Apakah ini mungkin dengan salah satu format seperti bzip2, xz, lzma, dll?

Saya pernah mengkodekan sesuatu menggunakan gzip yang bisa melakukan ini. Pada dasarnya pada level yang sangat tinggi, yang dilakukannya adalah mengecek beberapa blok gzip bersama-sama, lalu saya memiliki util yang dapat mencari mundur dari akhir file sampai kapan blok terakhir dimulai. File-file ini sepenuhnya dapat dibaca oleh utilitas gzip standar, tapi saya berharap ada sesuatu yang sedikit lebih standar tersedia.

Tujuan utama untuk ini adalah untuk file log yang saya dapat menulis terkompresi, dan kemudian dapat melakukannya tail(bahkan ketika mereka belum sepenuhnya ditulis; yaitu streaming) tanpa harus menunggu semuanya dibaca dari disk atau jaringan.

Patrick
sumber

Jawaban:

5

gzip memiliki opsi --rsyncable yang pada dasarnya sama . Bagian yang tidak standar adalah utilitas "ztail" gzip-block-aware, tetapi sepertinya Anda sudah mengatasinya.

the-wabbit
sumber
2
Tentu saja opsi itu secara efektif membatasi Anda ke sesuatu seperti -0,5 tingkat kompresi, bahkan jika Anda menentukan -9.
psusi
dari mana Anda mendapatkan versi gzip yang mendukung ini? Jika ini adalah opsi pada satu titik, tampaknya telah dihapus.
Patrick
Distro berbasis Debian memang memilikinya - ini dari Ubuntu 10.04: root @ backup1: ~ # gzip -V gzip 1.3.12 root @ backup1: ~ # gzip -h | egrep rsync --rsyncable Buat arsip ramah-rsync
the-wabbit
Rupanya, beberapa pengelola distro lain (misalnya Fedora) tampaknya telah memasukkan tambalan juga. Dan ada tambalan untuk gzip lawas di sini: samba.org/netfilter/diary/gzip.rsync.patch yang mungkin berlaku untuk versi yang lebih baru dengan sedikit modifikasi, jika Anda benar-benar perlu melakukan kompilasi sendiri.
the-wabbit
BTW, diskusi menunjukkan bahwa dampak pada kompresi agak diabaikan (dalam 2-3%), meskipun jarak tempuh untuk dataset tertentu mungkin bervariasi. Jika Anda memerlukan kompresi "tersedia" dengan algoritme adaptif seperti deflate, hampir tidak ada jalan lain untuk menyetel ulang algoritme sesekali - tentu saja ini akan mendorong hit efisiensi kompresi.
the-wabbit
0

FWIW: Saya telah mengembangkan alat baris perintah pada kode sumber zlib.c zlib yang membuat indeks untuk file gzip: https://github.com/circulosmeos/gztool

Itu dapat membuat ekor file gzip terus menerus dengan -Topsi. Atau hanya buntut isi terakhir dan berhenti, dengan -t(Banyak pilihan lain yang tersedia).

Perhatikan bahwa untuk semua tindakan ini gztoolakan membuat file indeks disatukan dengan tindakan itu.

Indeks dapat diinterupsi kapan saja dan digunakan kembali dan / atau selesai nanti. Dan seperti yang gztoolbisa diperintahkan untuk mengekstrak data dari setiap tempat di file, dan akan membuat indeks disatukan dengan tindakan itu, tidak pernah ada waktu yang hilang saat menggunakannya.

circulosmeos
sumber