Czy istnieje format kompresji, który obsługuje operacje ogona?

12

Szukam formatu kompresji, który obsługuje tailed. Oznacza to, że nie musisz czytać całego pliku, aby uzyskać ostatnie X nieskompresowanych bajtów. Czy jest to możliwe w przypadku dowolnego z formatów takich jak bzip2, xz, lzma itp.?

Kiedyś zakodowałem coś przy użyciu gzip, który mógłby to zrobić. Zasadniczo na naprawdę wysokim poziomie, to, co zrobiło, to połączenie wielu bloków gzip razem, wtedy miałem taki użytek, który mógł wyszukiwać wstecz od końca pliku, aż do uruchomienia ostatniego bloku. Pliki te były w pełni czytelne przez standardowe narzędzia gzip, ale mam nadzieję, że jest coś bardziej znormalizowanego.

Ostatecznym celem tego są pliki dziennika, które mogę zapisać skompresowane, a następnie być w stanie tailje uzyskać (nawet jeśli nie zostały w pełni zapisane, tj. Przesyłanie strumieniowe) bez konieczności oczekiwania na odczyt całego pliku z dysku lub sieci.

Patrick
źródło

Odpowiedzi:

5

gzip ma opcję --rsyncable, która robi to samo . Niestandardową częścią byłoby narzędzie „ztail” obsługujące blokowanie gzip, ale wygląda na to, że już sobie z tym poradziłeś.

the-wabbit
źródło
2
Oczywiście ta opcja skutecznie ogranicza cię do poziomu kompresji -0.5, nawet jeśli podasz -9.
psusi
skąd masz wersję gzip, która to obsługuje? Jeśli w pewnym momencie była to opcja, wydaje się, że została usunięta.
Patrick,
Dystrybucje oparte na Debianie mają to - pochodzi z Ubuntu 10.04: root @ backup1: ~ # gzip -V gzip 1.3.12 root @ backup1: ~ # gzip -h | egrep rsync --rsyncable Utwórz archiwum przyjazne rsync
the-wabbit
Wygląda na to, że niektórzy inni opiekunowie dystrybucji (np. Fedora) również zawierają łatki. I tutaj jest łatka dla starszego gzipa : samba.org/netfilter/diary/gzip.rsync.patch, która może mieć zastosowanie do nowszej wersji z niewielkimi modyfikacjami, jeśli naprawdę potrzebujesz się skompilować.
the-wabbit
BTW, dyskusje sugerują, że wpływ na kompresję jest raczej znikomy (w granicach 2-3%), chociaż przebieg dla określonego zestawu danych może się różnić. Jeśli potrzebujesz kompresji „dostosowalnej” za pomocą algorytmów adaptacyjnych, takich jak deflate, od czasu do czasu zresetowanie algorytmu nie jest możliwe - oczywiście spowoduje to obniżenie wydajności kompresji.
the-wabbit
0

FWIW: Opracowałem narzędzie wiersza poleceń na kodzie źródłowym zran.c zlib, który tworzy indeksy dla plików gzip: https://github.com/circulosmeos/gztool

Może tworzyć ciągły ogon pliku gzip z -Topcją. Lub tylko ogon ostatniej zawartości i zatrzymaj, z -t(Dostępnych jest wiele innych opcji).

Zauważ, że dla każdej z tych akcji gztoolutworzy plik indeksu przeplatany z tą akcją.

Indeksy można przerwać w dowolnym momencie i ponownie wykorzystać i / lub uzupełnić później. I jak gztoolmożna po prostu nakazać wyodrębnienie danych z dowolnego miejsca w pliku i utworzenie indeksu przeplatanego tą akcją, nigdy nie stracisz czasu podczas korzystania z niego.

circulosmeos
źródło