Szybsza alternatywa dla ArchiveMount?

15

W tej chwili używam ArchiveMountdo 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.gzpliku? Próbuję zamontować w folderze i rozpakowanie zajmuje kilka koncertów. Nie potrzebuję nawet trybu zapisu, wystarczy tylko odczyt.

użytkownik511046
źródło
Istnieje również AVFS ; Nie mam pojęcia, czy będzie działać lepiej.
Gilles „SO- przestań być zły”
8
Jeśli twoje pliki zostały skompresowane jako moduł squashfs zamiast jako tarball, dostęp tylko do odczytu byłby bardzo szybki - wystarczy (zapętlić) zamontować moduł squashfs. Wymaga pakietu squashfs-tools.
dru8274,
Obecnie programuję taki system plików. Poczekaj kilka miesięcy i już tam będzie.
FUZxxl
@FUZxxl Cóż, minęły już 2 lata, czy napisałeś kiedyś to narzędzie?
cybernard
@cybernard FUSE tak bardzo mnie frustrowało, że zrezygnowałem z tego projektu. Nienawidzę tego nieudokumentowanego kawałka gówna. Trzymam to na tylnym palniku i może przywrócę to później.
FUZxxl,

Odpowiedzi:

7

Możesz także utworzyć skompresowany obraz squashfs

mksquashfs /etc squashfs.img -comp xz
mkdir img
mount -o squashfs,ro squashfs.img img

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
6

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 je tar 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.

mrożony
źródło
3
Aby uzyskać losowy dostęp do skompresowanego pliku, możesz także użyć pixz.
kubańczyk
6

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:

pip3 install --user ratarmount
ratarmount my-huge-tar.tar mount-folder
ls -la mount-folder # will show the contents of the tar top-level

Kiedy skończysz, możesz odmontować go jak każdy uchwyt FUSE:

fusermount -u mount-folder

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 prostej findkomendy.

Porównanie testów porównawczych między ratarmount i archivemount

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ęp catzajmuje 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 findwewną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.

mxmlnkn
źródło
Jak OP zainstaluje się i wykorzysta to do rozwiązania swojego problemu?
Jeff Schaller
@JeffSchaller Dodałem instrukcje instalacji z github readme.md
mxmlnkn
0

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.

HalosGhost
źródło
Wbudowana przeglądarka archiwów vima nadal musi skanować cały plik, aby uzyskać listę, niewiele szybciej niż avfs i archiwizowanie. a wyświetlanie tak ogromnej listy milionów linii jest również okropne.
把 友情 留 在 无 盐
0

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.

Joshua Huber
źródło
nie ma potrzeby stosowania dodatkowych mediów, wystarczy urządzenie pętli.
把 友情 留 在 无 盐