W tej chwili używam ArchiveMount
do zamontowania archiwum o wielkości 123 000 kb, zawierającego ponad 3 miliony plików. Do tej pory był montowany przez ponad 5 godzin i nadal nie jest gotowy.
Czy istnieje lepszy sposób na zamontowanie .tar.gz
pliku? Próbuję zamontować w folderze i rozpakowanie zajmuje kilka koncertów. Nie potrzebuję nawet trybu zapisu, wystarczy tylko odczyt.
Odpowiedzi:
Możesz także utworzyć skompresowany obraz squashfs
Aby to zrobić, musisz wyodrębnić swoje archiwum tar.gz.
Zaletą jest również to, że obraz ma lepszą odporność na uszkodzenia niż gz.
źródło
Problem polega na tym, że format TAR (Tape ARchive) jest przeznaczony do dostępu sekwencyjnego, a nie losowego. A gzip jest dobrym uzupełnieniem tar, ponieważ jest to format kompresji oparty na strumieniu, również nie do losowego dostępu.
Tak więc narzędzie wysokiego poziomu, które nie wchodzi bezpośrednio w interakcję ze skompresowanymi blokami, będzie musiało przeanalizować cały plik za każdym razem, gdy będzie musiało cokolwiek czytać, najpierw aby uzyskać listę plików, a następnie być może pamięć podręczna unieważnia się i odczytuje ją ponownie , a następnie dla każdego skopiowanego pliku może go ponownie przeczytać. Państwo może uczynić narzędzie, które pamięta położenie każdego pliku, a co blokuje musi rozpakować je zdobyć, ale wydaje się, że niewiele z nich przeszkadza z tym.
Jeśli chcesz, aby działało to szybciej, zrób
tar tzf file.tar.gz > filelist
, otwórz listę plików w vimie , gedicie lub czymkolwiek innym , usuń wiersze niepotrzebnych plików, zapisz, a następnie wypakuj jetar xzf file.tar.gz -T filelist -C extracted/
.Aby uzyskać losowy dostęp do skompresowanego pliku, powinieneś użyć zip z rozszerzeniami posix, rar lub, jak sugeruje dru8274, squashfs, a nawet ZFS z włączoną kompresją lub btrfs, jeśli btrfs ma kompresję do działania w czasie czytania.
źródło
Napisałem szybszą alternatywną pozycję ratarmount , która „działa dla mnie”, ponieważ problem ten mnie ciągle denerwował.
Możesz użyć tego w następujący sposób:
Kiedy skończysz, możesz odmontować go jak każdy uchwyt FUSE:
Dlaczego jest szybszy niż archiwizacja?
To zależy od tego, co mierzysz.
Oto punkt odniesienia dla pamięci i wymaganego czasu do pierwszego montażu, a także czasów dostępu dla prostej
cat <file-in-tar>
komendy i prostejfind
komendy.Utworzono foldery zawierające każdy plik 1k, a liczba folderów jest różna.
Wykres po lewej u dołu pokazuje paski błędów wskazujące minimalny i maksymalny czas pomiaru
cat <file>
dla 10 losowo wybranych plików.Czas wyszukiwania pliku
Porównanie zabójców to czas potrzebny
cat <file>
do ukończenia. Z jakiegoś powodu skaluje się liniowo z rozmiarem pliku TAR (ok. Bajtów na plik x liczba plików) dla archiwizacji, przy jednoczesnym utrzymywaniu stałego czasu w ratarmount. To sprawia, że archivemount w ogóle nie obsługuje wyszukiwania.Jest to szczególnie zauważalne w przypadku skompresowanych plików TAR.
cat <file>
zajmuje ponad dwa razy więcej czasu niż zamontowanie całego pliku .tar.bz2! Na przykład, TAR z 10k pustych (!) Plików wymaga zamontowania z archiwizacją przez 2,9 s, ale w zależności od pliku, do którego uzyskano dostęp, dostępcat
zajmuje od 3ms do 5s. Czas potrzebny wydaje się zależeć od pozycji pliku w TAR. Pliki na końcu TAR potrzebują więcej czasu; wskazując, że „seek” jest emulowane i cała zawartość w TAR przed odczytaniem pliku.Uzyskanie zawartości pliku może zająć ponad dwa razy więcej czasu niż samo zamontowanie całego pliku TAR. Przynajmniej powinien zakończyć się w tym samym czasie co montaż. Jednym z wyjaśnień byłoby to, że plik jest szukany naśladowany więcej niż raz, może nawet trzykrotnie.
Pozyskiwanie pliku Ratarmount z pozoru zajmuje zawsze tyle samo czasu, ponieważ obsługuje prawdziwe wyszukiwanie. W przypadku plików TAR skompresowanych bzip2 szuka nawet bloku bzip2, którego adresy są również przechowywane w pliku indeksu. Teoretycznie jedyną częścią, która powinna być skalowana wraz z liczbą plików, jest wyszukiwanie w indeksie i która powinna być skalowana za pomocą O (log (n)), ponieważ jest ona posortowana według ścieżki pliku i nazwy.
Ślad pamięci
Ogólnie rzecz biorąc, jeśli masz więcej niż 20 000 plików w TAR, to ślad pamięci ratarmount będzie mniejszy, ponieważ indeks jest zapisywany na dysku podczas tworzenia, a zatem ma stały rozmiar pamięci około 30 MB w moim systemie.
Małym wyjątkiem jest backend dekodera gzip, który z jakiegoś powodu wymaga więcej pamięci, gdy gzip staje się większy. Ten narzut pamięci może być indeksem wymaganym do wyszukiwania wewnątrz TAR, ale potrzebne są dalsze badania, ponieważ nie napisałem tego backendu.
W przeciwieństwie do tego, archivemount utrzymuje cały indeks, tj. 4 GB dla plików 2M, całkowicie w pamięci tak długo, jak TAR jest zamontowany.
Czas montażu
Moją ulubioną funkcją jest to, że ratarmount może zamontować TAR bez zauważalnego opóźnienia przy każdej kolejnej próbie. Wynika to z faktu, że indeks, który odwzorowuje nazwy plików na metadane i pozycję wewnątrz TAR, jest zapisywany w pliku indeksu utworzonym obok pliku TAR.
Wymagany czas montażu zachowuje się trochę dziwnie w przypadku archiwizacji. Zaczynając od około 20 000 plików, zaczyna się skalować kwadratowo zamiast liniowo względem liczby plików. Oznacza to, że począwszy od około 4M plików, ratarmount zaczyna być znacznie szybszy niż archiwizowanie, chociaż w przypadku mniejszych plików TAR jest nawet 10 razy wolniejszy! Z drugiej strony, w przypadku mniejszych plików nie ma większego znaczenia, czy zamontowanie tar (po raz pierwszy) zajmuje 1 czy 0,1 s.
Czasy montażu skompresowanych plików BZ2 są zawsze najbardziej porównywalne. Jest to bardzo prawdopodobne, ponieważ jest związane z prędkością dekodera bz2. Ratarmount jest tutaj około 2x wolniejszy. Mam nadzieję, że ratarmount będzie wyraźnym zwycięzcą dzięki równoległemu dekoderowi bz2 w najbliższej przyszłości, co nawet dla mojego 8-letniego systemu może przynieść 4x przyspieszenie.
Czas na metadane
Po prostu wyświetlając listę wszystkich plików
find
wewnątrz TAR (find wydaje się również wywoływać stat dla każdego pliku !?), ratarmount jest 10 razy wolniejszy niż archiwizacja dla wszystkich testowanych przypadków. Mam nadzieję poprawić to w przyszłości. Ale obecnie wygląda to na problem projektowy z powodu używania Pythona i SQLite zamiast czystego programu C.źródło
Nie obejmie to wszystkich przypadków użycia, ponieważ ogranicza użycie do edytora tekstu. Ale jeśli zależy Ci tylko na dostępie do odczytu, może być to pomocne w niektórych sytuacjach.
vim
, po uruchomieniu na tarballu wyświetli się hierarchia zawartości archiwum (podobnie jak w przypadku wyświetlania hierarchii plików, jeśli jest uruchomiony w katalogu). Wybierając jeden z plików z listy, otworzy wybrany plik w buforze tylko do odczytu.Ponownie, niekoniecznie oferuje to dostęp do obrazów lub innych multimediów, ale jeśli wszystko, czego potrzebujesz, to zobaczyć zawartość lub uzyskać dostęp tylko do plików tekstowych, to powinno być pomocne.
Uwaga : nie będzie działać na wszystkich formatach archiwów.
źródło
Moje podejście Jeśli masz wystarczającą ilość wolnego miejsca na zewnętrznym napędzie USB lub zewnętrznym / dodatkowym dysku twardym z wystarczającą ilością miejsca, rozważ wyodrębnienie pliku .tar.gz. Myślenie, że prawdopodobnie nie chcesz 3 milionów plików na głównym dysku systemowym, ponieważ może to spowolnić proces. Polecam, aby dysk zewnętrzny w tym przypadku miał system plików, który z łatwością obsługuje ogromną liczbę plików: myśląc ReiserFS, ext4 (z opcją dir_index), XFS, może BtrFS. Wyodrębnienie może potrwać 1-2 godziny, ale możesz w międzyczasie pójść na lunch lub pozwolić mu skończyć się przez noc; po powrocie dostęp do wyodrębnionych plików powinien być wydajny.
źródło