2012-10-07 15 views
9

Używam serwera opartego na pętli zdarzeń w skręconym pythonie, który przechowuje pliki i chciałbym móc klasyfikować pliki zgodnie z ich kompresją.Jak mogę oszacować ściśliwość pliku bez kompresji?

Jeśli prawdopodobieństwo, że oni korzystać z kompresji jest wysoki, pójdą do katalogu z kompresją btrfs włączony, inaczej oni iść gdzie indziej.

nie muszę mieć pewność - dokładność 80% byłoby mnóstwo, i zaoszczędzić sporo miejsca. Ale ponieważ jest problem z CPU i wydajnością fs, nie mogę po prostu zapisać wszystkiego skompresowanego.

Pliki są w niskich megabajtów. Nie mogę przetestować - skompresować ich bez użycia ogromnej części procesora i nadmiernie opóźnić pętlę zdarzeń lub zreorganizować algorytm kompresji, aby pasował do pętli zdarzeń.

Czy istnieje najlepszych praktyk, aby dać szybkie oszacowanie ściśliwości? To, co wymyśliłem, zajmuje niewielką porcję (kilka KB) danych z początku pliku, przetestuj go (z prawdopodobnym opóźnieniem) i oprzyj moją decyzję na tym.

Wszelkie sugestie? Poradnik? Wady mojego rozumowania i/lub problemu?

+2

Wystarczy stwierdzić, że nie wspomniano o algorytmie kompresji, który planujesz użyć. Powiedziawszy to, nie wydaje mi się, że nic nie możesz zrobić bez sprawdzenia co najmniej raz tego pliku. – Alexander

+0

Dlaczego nie możesz użyć kompresji progresywnej? –

+0

Kompresowanie małej części nie pomoże: jeśli reszta pliku jest właśnie wykonana z kopii tej części, kompresja będzie łatwa. Obawiam się, że jedynym dobrym rozwiązaniem jest skompresowanie całego pliku. –

Odpowiedz

9

Po prostu 1K z środkowy z pliku załatwi sprawę. Nie chcesz początku ani końca, ponieważ mogą one zawierać informacje nagłówka lub zwiastuna, które nie są reprezentatywne dla reszty pliku. 1K wystarcza, aby uzyskać pewną kompresję z dowolnym typowym algorytmem. To będzie przewidywać względną kompresję dla całego pliku, w takim stopniu, w jakim środkowy 1K jest reprezentatywny. Bezwzględny stosunek, który otrzymasz, nie będzie taki sam jak dla całego pliku, ale kwota, która różni się od braku kompresji, pozwoli ci ustawić próg. Po prostu eksperymentuj z wieloma plikami, aby zobaczyć, gdzie ustawić próg.

Jak już wspomniano, można zaoszczędzić czas, nie robiąc nic dla plików, które są oczywiście już skompresowane, np. .png. .jpg, .mov, .pdf, .zip, itp.

Pomiar entropii niekoniecznie jest dobrym wskaźnikiem, ponieważ daje jedynie szacunkową wartość ściśliwości rzędu zerowego. Jeśli entropia wskazuje, że jest wystarczająco ściśliwy, to jest w porządku. Jeśli entropia wskazuje, że nie jest wystarczająco ściśliwy, to może lub nie może być właściwa. Rzeczywista kompresor jest znacznie lepszym estymatorem ściśliwości. Uruchomienie go na 1K nie potrwa długo.

+0

Z moimi testowymi danymi 1K tego nie robi, ale wydaje się, że 10K wystarcza do oszacowania, jaki współczynnik kompresji można osiągnąć z całością ale wciąż mam do czynienia z liczbami, więc wrócę do ciebie :) – elpollodiablo

6

myślę co szukasz jest How to calculate the entropy of a file?

to pytanie zawiera wszelkiego rodzaju metod obliczania entropii pliku (i przez które można dostać „kompresji” pliku). Oto cytat z artykułu streszczenie this (Zależność między Entropia i Test Data Compression Kedarnath J. Balakrishnan, członek, IEEE i Nur A. Touba, Senior Member IEEE):

entropii zestawu danych jest miarą ilości informacji w nim zawartych. Obliczenia entropii dla w pełni wyspecyfikowanych danych zostały wykorzystane do uzyskania teoretycznego ograniczenia, o ile dane mogą być skompresowane. Artykuł ten rozszerza pojęcie entropii dla niepełnie określonych danych testowych (to znaczy, które mają nieokreślone lub nie obchodzi bity) i bada użycie entropii, aby pokazać, jak można obliczyć granice maksymalnej kompresji dla określonego podziału na symbole. Badano wpływ różnych sposobów podziału danych testowych na symbole na entropii. Dla klasy partycji, które używają znaków o stałej długości, opisany jest chciwy algorytm do określania, nie dbając o zmniejszenie entropii. Okazuje się, że jest to odpowiednik minimalnego problemu z pokrywą zestawu entropijnego, a zatem znajduje się w granicach stałego błędu addytywnego w odniesieniu do minimalnej entropii możliwej spośród wszystkich sposobów określania nie dba. Opisano algorytm wielomianowy, który można wykorzystać do przybliżenia obliczeń entropii. Różne techniki kompresji danych testowych zaproponowane w literaturze są analizowane w odniesieniu do granic entropii. Ograniczenia i zalety niektórych rodzajów strategii kodowania danych testowych są badane z wykorzystaniem teorii entropii

I być bardziej konstruktywne, kasa this miejsce dla realizacji Pythona obliczeń entropia kawałkami danych

+0

Dzięki za literaturę! Nie chciałem iść ścieżką akademicką, ale może być naprawdę interesujące przeprowadzenie testu z jednym lub dwoma algorytmami entropii, kompresja małego kawałka przykładowych danych i kompresja całego pliku. Myślę, że to zrobię i wrócę z wynikami :) – elpollodiablo

+0

byłoby bardzo fajnie :) – zenpoy

+0

Ok, więc muszę zabrać znacznik ponownie, ponieważ entropia (przynajmniej nie funkcja związana, ale nie jestem matematyk, więc co ja wiem o alternatywach;) nie jest drogą do zrobienia. Wprowadzę kolejne dane testowe do trybu online, ale na razie wygląda na to, że użycie algorytmu kompresji na małej próbce jest bardziej reprezentatywne niż potencjalna korelacja entropii - co jest bardziej rozmyte. – elpollodiablo

5

skompresowane pliki zwykle don nie kompresuje się dobrze. Oznacza to, że prawie każdy plik multimedialny nie będzie kompresował się bardzo dobrze, ponieważ większość formatów multimediów zawiera kompresję. Wyraźnie istnieją wyjątki od tego, takie jak obrazy BMP i TIFF, ale prawdopodobnie można zbudować białą listę dobrze skompresowanych typów plików (PNG, MPEG i odejście od wizualnego nośnika - gzip, bzip2, itp.), Aby pominąć i założyć reszta plików, które napotkasz, będzie dobrze kompresować.

Jeśli masz ochotę się zakochać, możesz zbudować sprzężenie zwrotne w systemie (obserwuj wyniki dowolnej kompresji, którą wykonujesz i powiąż wynikowy stosunek z typem pliku). Jeśli natrafisz na typ pliku, który ma stale słabą kompresję, możesz dodać go do białej listy.

Pomysły te zależą od tego, czy potrafią zidentyfikować typ pliku, ale są też standardowe narzędzia, które wykonują całkiem niezłą robotę (zazwyczaj znacznie lepiej niż 80%) - file (1), /etc/mime.types, itp.

+0

Byłoby to najlepsze rozwiązanie, gdyby początek pliku (a tym samym typ mime) był podany, a nim nie jest. To bardziej jak fragmenty arbitralnych danych, które często mogą być ściśliwe. – elpollodiablo

+0

Z pewnością musisz znaleźć sposób na odnalezienie początku pliku z dowolnego fragmentu pliku - w przeciwnym razie jak zrekonstruować cały plik?Ale jeśli naprawdę nie możesz tego zrobić, to myślę, że to podejście jest wykluczone (z pewnością ma sens jako rozwiązanie dla * serwera plików * niż dla * dowolnych fragmentów serwera plików * (twoje pytanie to spowodowało brzmi, jakbyś miał do czynienia z tym pierwszym :) –

+0

Przykro mi, tak naprawdę są to pliki zdekonstruowane, jak się domyślasz poprawnie, powinienem to uwzględnić, aby wyeliminować możliwość typu mime. Przepływ pracy nie pozwala na rekonstrukcję mucha, ponieważ jest to inna część systemu, która wie, jak to zrobić. – elpollodiablo

Powiązane problemy