Jak mogę przyspieszyć operacje na rzadkich plikach za pomocą tar, gzip, rsync?


9

Mam rzadki plik. ( du -hraporty 3G i du -h --apparent-size100G.) Jak dotąd, tak dobrze.

Teraz, gdy chcę skompresować plik za pomocą tarlub wysłać go przez sieć rsync, będzie to wymagało tyle czasu, co 3G. Wygląda na to, że te narzędzia odczytują wszystkie zera.

Myślałem, że dziury są w jakiś sposób oznaczone, a te narzędzia mogą je po prostu pominąć?

Prawdopodobnie nie ma problemu z moim plikiem?

Czy to brakuje funkcji tari rsyncnie szuka rzadkich plików? Użyłem tego tarparametru --sparse, ale to nie przyspieszyło. Nie zmienił się też rsyncparametr --sparse.

Czy jest jakiś sposób na przyspieszenie tych narzędzi w rzadkich plikach?

Odpowiedzi:


7

bsdtar(przynajmniej od libarchive3.1.2) jest w stanie wykryć rzadkie sekcje za pomocą FS_IOC_FIEMAPioctl w systemach plików, które go obsługują (chociaż obsługuje również wiele innych interfejsów API), jednak, przynajmniej w moim teście, o dziwo, jest to nie jest w stanie obsłużyć tarplików, które sam generuje (wygląda to jednak na błąd).

Jednak użycie GNU tardo ich wyodrębnienia działa, ale wtedy GNU tar nie może obsłużyć niektórych rozszerzonych atrybutów obsługiwanych przez bsdtar.

Więc

bsdtar cf - sparse-files | (cd elsewhere && tar xpf -)

działa, dopóki pliki nie mają rozszerzonych atrybutów ani flag.

Nadal nie działa dla plików, które są w pełni rzadkie (tylko zera), ponieważ FS_IOC_FIEMAPioctl następnie zwraca 0 zakresu i wygląda na to, że bsdtarnie obsługuje tego poprawnie (kolejny błąd?).

star( Schily tar ) to kolejna implementacja tar typu open source, która może wykrywać rzadkie pliki (użyj -sparseopcji) i nie zawiera tych błędów bsdtar(ale nie jest pakowana przez wiele systemów).


2

W tym artykule zawarto kilka przydatnych sugestii dotyczących rsyncco najmniej:

Problemy

Używanie rsync --sparse works, ale powoduje ogromne podłączenie niepotrzebnych zapisów na dysku. Zmiana 10 bajtów na 50 GB długości (używany 1 GB) powinna spowodować zapisanie jednego lub dwóch bloków, co spowoduje zapisanie 1 GB. Jest to powolne i możliwe, że nie sprzyja długowieczności dysków.

Korzystanie rsync --inplacedziała, ale tworzy pliki nieliczne.

Nie można jednocześnie używać opcji --sparse i --inplace :-( jest to zabronione przez rsync. Rsync: --sparse nie można używać z --inplace

Rozwiązanie

Jeśli użyjesz opcji --inplace, aby zaktualizować istniejący wcześniej plik rozrzedzony, plik pozostanie rzadki i zapisana będzie tylko niewielka liczba bloków. Tylko gdy rsync --inplace tworzy plik, sprawia, że ​​jest on rzadki.

Tak więc rozwiązaniem jest utworzenie odpowiedniego, poprawnie wydłużonego, pustego i rzadkiego pliku na komputerze docelowym dla każdego pliku na komputerze źródłowym - jeśli plik nie jest jeszcze obecny na komputerze docelowym.

Następnie rsync --inplace będzie działał zgodnie z przeznaczeniem, pozostawiając rzadkie pliki rzadkie i tylko zapisując zmienione bloki na dysku.

Tak więc, jeśli dobrze to przeczytam, najpierw musisz utworzyć pusty plik rozrzedzony w celu. Możesz to zrobić za pomocą

truncate -s 3G filename

Następnie możesz użyć rsync --inplacedo skopiowania plików. Powinno to być konieczne tylko raz.


Ten sam artykuł sugeruje użycie Virtsync, który jest

komercyjne narzędzie wiersza polecenia systemu Linux o wartości 49 USD do synchronizacji zawartości dużych plików (takich jak obrazy dysków i bazy danych maszyn wirtualnych).

To może być najlepsze rozwiązanie, jeśli chcesz za to zapłacić, ponieważ wydaje się, że jest napisane specjalnie dla tego rodzaju sytuacji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.