Formaty kompresji z dobrą obsługą losowego dostępu do archiwów?

Jest to podobne do poprzedniego pytania , ale odpowiedzi tam nie zaspokajają moich potrzeb i moje pytanie jest nieco inne:

Obecnie używam kompresji gzip dla bardzo dużych plików, które zawierają posortowane dane. Gdy pliki nie są skompresowane, wyszukiwanie binarne jest poręcznym i wydajnym sposobem wspierania poszukiwania lokalizacji w posortowanych danych.

Ale gdy pliki są skompresowane, sprawy stają się trudne. Ostatnio dowiedziałam się o opcji zlib'S Z_FULL_FLUSH , które mogą być używane podczas kompresji do wstawiania" punktów synchronizacji " w skompresowanym wyjściu (inflateSync() może następnie rozpocząć odczyt z różnych punktów w pliku). Jest to OK, chociaż pliki, które już mam, musiałyby zostać skompresowane, aby dodać tę funkcję (I O dziwo gzip nie ma do tego opcji, ale jestem gotów napisać własny program do kompresji, jeśli muszę).

Wydaje się z jednego źródła , że nawet Z_FULL_FLUSH nie jest idealnym rozwiązaniem...nie tylko nie jest obsługiwany przez wszystkie gzip archiwa, ale sama idea wykrywania punktów synchronizacji w archiwach może generować fałszywe alarmy (albo przez zbieg okoliczności z magiczną liczbą punktów synchronizacji, albo ze względu na fakt, że Z_SYNC_FLUSH produkuje również punkty synchronizacji, ale nie nadają się one do dostępu losowego).

Czy jest lepsze rozwiązanie? Chciałbym uniknąć plików pomocniczych do indeksowania, jeśli to możliwe, a jawne, domyślne wsparcie dla quasi-losowego dostępu byłoby pomocne (nawet jeśli jest to wielkoziarniste-jak możliwość rozpoczęcia czytania w każdy odstęp 10 MB). Czy istnieje inny format kompresji z lepszą obsługą losowych odczytów niż gzip?

Edit: Jak już wspomniałem, chcę wykonać wyszukiwanie binarne w skompresowanych danych. Nie muszę szukać konkretnej (nieskompresowanej) pozycji-tylko szukać z pewną grubą ziarnistością w skompresowanym pliku. Po prostu chcę wsparcia dla czegoś takiego jak " Dekompresja danych począwszy od około 50% (25%, 12,5%, itp.) drogi do tego skompresowanego pliku."

Author: Community, 2009-01-10

12 answers

Nie znam żadnego skompresowanego formatu pliku, który wspierałby losowy dostęp do konkretnej lokalizacji w nieskompresowanych danych (no, poza formatami multimedialnymi), ale możesz sam sobie zaparzyć.

Na przykład skompresowane pliki bzip2 składają się z niezależnych skompresowanych bloków o rozmiarze

Myślę jednak, że najlepszym rozwiązaniem byłoby podzielenie pliku na dowolne kawałki, a następnie skompresowanie go za pomocą jakiegoś archiwizatora, takiego jak zip lub rar, które obsługują losowy dostęp do poszczególnych plików w archiwum.

 17
Author: jpalecek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-09 23:33:07

Spójrz na dictzip . Jest kompatybilny z gzip i umożliwia zgrubny losowy dostęp.

Fragment jego strony man:

Dictzip kompresuje pliki za pomocą algorytmu gzip (1) (LZ77) w sposób, który jest w pełni kompatybilny z formatem pliku gzip. Rozszerzenie do gzip format pliku (Dodatkowe pole, opisane w 2.3.1.1 RFC 1952) pozwala na dodatkowe dane do zapisania w nagłówku skompresowanego pliku. Programy takie jak gzip i zcat zignoruje te dodatkowe dane. Jednak [dictzcat --start] wykorzysta tych danych do wykonania pseudolosowego dostępu do pliku.

Mam pakiet dictzip w Ubuntu. Lub jego kod źródłowy jest w dictd -*.smoła.gz . Jego licencja to GPL. Możesz ją studiować.

Aktualizacja:

Poprawiłem dictzip, aby nie miał limitu rozmiaru pliku. moja implementacja jest na licencji MIT.

 30
Author: Ivo Danihelka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-21 22:11:49

The .format pliku xz (który wykorzystuje kompresję LZMA) wydaje się wspierać to:

Random-access reading: dane mogą być podzielone na niezależnie skompresowane bloki. Każdy .plik xz zawiera indeks bloków, co umożliwia ograniczony dostęp losowy, gdy rozmiar bloku jest wystarczająco mały.

To powinno wystarczyć do twojego celu. Wadą jest to, że API liblzmy (do interakcji z tymi kontenerami) nie wydaje się, że dobrze udokumentowane, więc może zająć trochę wysiłku wymyślenie, jak losowo uzyskać dostęp do bloków.

 8
Author: AardvarkSoup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-03 11:53:47

Istnieją rozwiązania zapewniające losowy dostęp do archiwów gzip i bzip2:

(szukam czegoś dla 7zip )

 7
Author: hippietrail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-17 01:42:32

bgzip może kompresować pliki w wariancie gzip, który jest indeksowalny (i może być dekompresowany przez gzip). Jest to używane w niektórych aplikacjach bioinformatycznych, wraz z indeksatorem tabix.

Zobacz wyjaśnienia tutaj: http://blastedbio.blogspot.fr/2011/11/bgzf-blocked-bigger-better-gzip.html , a tu: http://www.htslib.org/doc/tabix.html .

Nie wiem, w jakim stopniu można go dostosować do innych aplikacji.
 4
Author: bli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 18:29:29

Nie jestem pewien, czy byłoby to praktyczne w twojej sytuacji, ale czy nie mógłbyś po prostu gzipować każdy duży plik na mniejsze pliki, powiedzmy 10 MB każdy? Skończyłbyś z mnóstwem plików: file0.gz, file1.gz, file2.gz itp. Na podstawie podanego offsetu wewnątrz oryginalnego dużego można wyszukiwać w pliku o nazwie "file" + (offset / 10485760) + ".gz". Przesunięcie w nieskompresowanym archiwum wynosi offset % 10485760.

 3
Author: William Brendel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-10 06:43:51

Ponieważ kompresja bezstratna działa lepiej na niektórych obszarach niż na innych, jeśli przechowujesz skompresowane dane w blokach o dogodnej długości, nawet jeśli każdy blok ma dokładnie taką samą liczbę skompresowanych bajtów, niektóre skompresowane bloki rozszerzą się do znacznie dłuższego kawałka zwykłego tekstu niż inne.

You might look at "Kompresja: klucz do systemów odzyskiwania tekstu nowej generacji" autor: Nivio Ziviani, Edleno Silva de Moura, Gonzalo Navarro i Ricardo Baeza-Yates w Computer magazine November 2000 http://doi.ieeecomputersociety.org/10.1109/2.881693

Ich dekompresor pobiera 1, 2 lub 3 całe bajty skompresowanych danych i dekompresuje (używając listy słowników) do całego słowa. Można bezpośrednio przeszukiwać skompresowany tekst pod kątem słów lub fraz, co okazuje się jeszcze szybsze niż przeszukiwanie nieskompresowanego tekstu.

Ich dekompresor pozwala wskazać dowolne słowo w tekście normalnym (bajtowym) wskaźnikiem i natychmiast rozpocznij dekompresję.

Możesz nadać każdemu słowu unikalny 2-bajtowy Kod, ponieważ prawdopodobnie masz mniej niż 65 000 unikalnych słów w tekście. (W Biblii KJV jest prawie 13 000 unikalnych słów). Nawet jeśli istnieje więcej niż 65,000 słów, jest to dość proste, aby przypisać pierwsze 256 dwubajtowy kod " słowa "do wszystkich możliwych bajtów, dzięki czemu można przeliterować słowa, które nie są w leksykonie 65,000 lub tak"najczęstszych słów i zwrotów". (Kompresja uzyskana przez pakowanie częstych słów i zwrotów na dwa bajty Zwykle warto "rozszerzyć" od czasu do czasu pisowni słowa za pomocą dwóch bajtów na literę). Istnieje wiele sposobów na wybranie leksykonu "częstych słów i zwrotów", który da odpowiednią kompresję. Na przykład możesz dostosować kompresor LZW, aby zrzucał "frazy", których używa więcej niż raz, do pliku leksykonu, po jednej linii na frazę i uruchamiał je na wszystkich danych. Możesz też dowolnie pociąć nieskompresowane dane na 5 bajtowe frazy w pliku leksykonu, po jednej linijce na frazę. Możesz też pociąć nieskompresowane dane na rzeczywiste angielskie słowa i umieścić każde słowo-łącznie ze spacją na początku słowa-w pliku leksykonu. Następnie użyj opcji "sort --unique", aby wyeliminować zduplikowane słowa w tym pliku leksykonu. (Czy wybranie idealnej" optymalnej " leksykonowej listy słów jest nadal uważane za np-trudne?)

Przechowuj leksykon na początku swojego ogromnego skompresowanego pliku, umieść go w wygodnym rozmiarze bloku, a następnie przechowuj skompresowany tekst -- seria dwubajtowych "słów" -- stamtąd do końca pliku. Prawdopodobnie poszukiwacz przeczyta ten leksykon raz i zachowa go w jakimś szybkim formacie do dekodowania w pamięci RAM podczas dekompresji, aby przyspieszyć dekompresję "kodu dwubajtowego"do" wyrażenia o zmiennej długości". Mój pierwszy szkic zaczynałby się od prostej jednej linijki na listę fraz, ale możesz później przełączyć się na przechowywanie leksykonu w bardziej skompresowanej formie za pomocą jakiegoś kodowania przyrostowego lub zlib.

Możesz wybrać dowolny losowe przesunięcie parzystych bajtów do skompresowanego tekstu i rozpoczęcie dekompresji stamtąd. Nie wydaje mi się, aby możliwe było stworzenie drobnoziarnistego, losowego formatu skompresowanego pliku.

 3
Author: David Cary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-07 20:52:23

Dwa możliwe rozwiązania:

  1. Niech system operacyjny zajmuje się kompresją, tworzy i montuje skompresowany system plików (SquashFS, clicfs, cloop, cramfs, e2compr lub cokolwiek innego) zawierający wszystkie Twoje pliki tekstowe i nie rób nic z kompresją w programie aplikacji.

  2. Użyj clicfs bezpośrednio na każdym pliku tekstowym (jeden clicfs na plik tekstowy) zamiast kompresji obrazu systemu plików. Pomyśl o "mkclicfs mytextfile mycompressedfile "jako" gzip mycompressedfile " i "clicfs katalog mycompressedfile" jako sposób uzyskania losowego dostępu do danych poprzez plik "directory/mytextfile".

 1
Author: Joachim Wagner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-10 18:32:39

Nie wiem, czy już o nim wspomniano, ale projekt Kiwix wykonał w tym zakresie świetną robotę. Poprzez swój program Kiwix, oferują one losowy dostęp do archiwów plików ZIM. Dobra kompresja. Projekt powstał, gdy pojawiło się zapotrzebowanie na kopie offline Wikipedii (która osiągnęła ponad 100 GB w nieskompresowanej formie, z uwzględnieniem wszystkich mediów). Udało im się pobrać plik o pojemności 25 GB (jednoplikowe wcielenie Wikipedii bez większości mediów) i skompresować go do archiwum plików zim 8 GB. Dzięki programowi Kiwix możesz wywołać dowolną stronę Wikipedii, wraz ze wszystkimi powiązanymi danymi, szybciej niż możesz surfować po sieci.

Mimo że program Kiwix jest technologią opartą na strukturze bazy danych Wikipedii, dowodzi to, że można mieć doskonałe współczynniki kompresji i dostęp losowy jednocześnie.

 1
Author: CogitoErgoCogitoSum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-08 03:14:55

To bardzo stare pytanie, ale wygląda na to, że zindex mógłby dostarczyć dobrego rozwiązania (choć nie mam z nim dużego doświadczenia)

 1
Author: robochat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-04 07:26:19

Razip obsługuje dostęp losowy z lepszą wydajnością niż gzip/bzip2, które muszą być poprawione dla tego wsparcia-zmniejszając kompresję kosztem" ok " dostępu losowego:

Http://sourceforge.net/projects/razip/

 0
Author: Erik Aronesty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-23 15:07:36

Jestem autorem narzędzia open-source do kompresji określonego typu danych biologicznych. To narzędzie, zwane starch, dzieli dane na chromosomy i wykorzystuje te podziały jako wskaźniki do szybkiego dostępu do skompresowanych jednostek danych w większym archiwum.

Dane na chromosomy są przekształcane w celu usunięcia redundancji we współrzędnych genomowych, a przekształcone dane są kompresowane za pomocą algorytmów bzip2 lub gzip. Offsety, metadane i skompresowane dane genomowe są łączone w jednym pliku.

Kod źródłowy jest dostępny na naszej stronie GitHub. Skompilowaliśmy go pod Linuksem i Mac OS X.

W Twoim przypadku możesz przechowywać (10 MB lub cokolwiek innego) offsety w nagłówku do niestandardowego formatu archiwum. Analizujesz nagłówek, pobierasz offsety i stopniowo fseek przez plik przez current_offset_sum + header_size.

 0
Author: Alex Reynolds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-29 21:04:29