Problemy z pamięcią podczas kompresji i przesyłania dużej liczby małych plików (łącznie 1 TB)

15

Mam 5 milionów plików, które zajmują około 1 TB przestrzeni dyskowej. Muszę przenieść te pliki na stronę trzecią.

Jak najlepiej to zrobić? Próbowałem zmniejszyć rozmiar pliku .tar.gz, ale mimo że mój komputer ma 8 GB pamięci RAM, pojawia się błąd „brak pamięci systemowej”.

Czy najlepszym rozwiązaniem jest przesłanie plików pocztą elektroniczną?

oshirowanen
źródło
9
Czy masz problemy z TWORZENIEM a .tar.gzlub KOPIOWANIEM wynikowego skompresowanego pliku? Tak czy inaczej, coś jest dziwne, ponieważ żadna operacja nie powinna zajmować więcej pamięci tylko dlatego, że pliki są duże. Oznacza to, że obie operacje powinny być przesyłane strumieniowo. Podaj więcej informacji o tym, które polecenia nie działają.
Celada,
1
Jaką przepustowość masz ty i osoba trzecia do stracenia? Naiwny rsync może zaoszczędzić na wysyłce. Ale nie wiem, jak „pięć milionów” plików będzie dla ciebie działać, ponieważ rsync spróbuje zbudować listę plików w pamięci i może, jeśli lista (pliki 5e6)> 8 GB. I oczywiście będzie wolno.
Kalvin Lee,
2
@oshirowanen Nie sądzę, że powinno to zająć sporo pamięci przy obliczaniu listy plików, ponieważ jestem pewien, że tarpowinien po prostu archiwizować pliki przyrostowo podczas ich wyświetlania, nigdy nie budując listy w pamięci. Ale ponownie pokaż dokładne polecenie, którego używasz. Czy wszystkie pliki znajdują się w tym samym katalogu, czy struktura katalogów jest bardzo głęboka?
Celada,
3
Ach tak, programy GUI są często budowane bez przywiązywania dużej wagi do takich celów, jak skalowalność i solidność. Nie zaskoczyłoby mnie to, gdyby to była wina otoki / interfejsu GUI. Utwórz plik za pomocą wiersza polecenia i myślę, że przekonasz się, że działa dobrze.
Celada,
3
Przesyłanie 1 TB danych zajmie co najmniej 22 godziny w przypadku łącza szerokopasmowego 100 Mbit / s. Tak więc w zależności od oczekiwanego stopnia kompresji poczta ślimakowa może być rzeczywiście szybszą opcją.
Dan

Odpowiedzi:

27

Dodatkowe informacje podane w komentarzach ujawniają, że OP używa metody GUI do utworzenia .tar.gzpliku.

Oprogramowanie GUI często zawiera znacznie więcej wzdęć niż równoważne równoważne oprogramowanie wiersza poleceń lub wykonuje dodatkowe niepotrzebne zadania ze względu na pewne „dodatkowe” funkcje, takie jak pasek postępu. Nie zaskoczyłoby mnie, gdyby oprogramowanie GUI próbowało zebrać listę wszystkich nazw plików w pamięci. Nie trzeba tego robić, aby utworzyć archiwum. Dedykowane narzędzia tari z gzippewnością zostały zaprojektowane do pracy ze strumieniowym wejściem i wyjściem, co oznacza, że ​​mogą poradzić sobie z wejściami i wyjściami znacznie większymi niż pamięć.

Jeśli unikniesz programu GUI, najprawdopodobniej możesz wygenerować to archiwum przy użyciu zupełnie normalnego codziennego tarwywołania, takiego jak to:

tar czf foo.tar.gz foo

gdzie foojest katalog zawierający wszystkie 5 milionów plików.

Inne odpowiedzi na to pytanie dają kilka dodatkowych alternatywnych tarpoleceń do wypróbowania na wypadek, gdybyś chciał podzielić wynik na wiele części itp.

Celada
źródło
15

„pięć milionów” plików i łącznie 1 TB? Twoje pliki muszą więc być bardzo małe. Po prostu spróbuję rsync:

rsync -alPEmivvz /source/dir remote.host.tld:/base/dir

Jeśli tego nie masz - lub twoja skrzynka nie pozwala na użycie rsync, sprawdziłbym przynajmniej, czy 7zdziała z twoimi danymi. Może nie, ale myślę, że nadal warto spróbować:

7z a archive.7z /source/dir

Lub jeśli nie czujesz się komfortowo, 7zprzynajmniej spróbuj utworzyć .tar.xzarchiwum:

tar cJv archive.tar.xz /source/dir

(należy zauważyć, że starsze wersje tarnie tworzą .tar.xzarchiwów, ale .tar.lzmaarchiwa podczas korzystania z Jprzełącznika. Nawet starsze wersje tarnie obsługują Jflagi całkowicie).


Ponieważ używasz programu GUI do tworzenia tych plików, zakładam, że czujesz się trochę nieswojo przy użyciu interfejsu wiersza poleceń.

Aby ułatwić tworzenie, zarządzanie i wyodrębnianie archiwów z interfejsu wiersza poleceń, istnieje małe narzędzie o nazwie atool. Jest dostępny dla praktycznie każdej popularnej dystrybucji, którą widziałem, i działa prawie na każde archiwum, na które natknąłem się, chyba że te beznadziejnie niejasne.

Sprawdź, czy Twoja dystrybucja ma atoolswoje repozytorium, lub poproś administratora, aby zainstalował ją, gdy jest w środowisku pracy.

atool instaluje do siebie kilka dowiązań symbolicznych, więc pakowanie i rozpakowywanie staje się dziecinnie proste:

apack archive.tar.xz <files and/or directories>

Tworzy archiwum.

aunpack archive.7z

Rozszerza archiwum.

als archive.rar

Wyświetla zawartość pliku.

Jaki rodzaj archiwum jest tworzony, atoolrozpoznaje to po rozszerzeniu nazwy pliku archiwum w wierszu polecenia.

polemon
źródło
4
Zaletą korzystania z rsynctego jest to, że jeśli (kiedy) połączenie zostanie zerwane, rsyncmoże odebrać tam, gdzie zostało przerwane.
roaima
2
Pliki miałyby średnio 200 KB. To wcale nie jest takie małe.
Nate Eldredge
4
@NateEldredge Zwykle uważam, że duże znaczenie to> 1 GB. Mały jest zwykle <1 MB. Taki całkiem mały.
PythonNut
8

O ile nie można wykonać kompresji lepszej niż 25: 1, prawdopodobnie nie zyska się na kompresji przed przesłaniem ślimaka, chyba że istnieje jakiś sprzętowy format taśmy, który można wymienić na stronie trzeciej.

Największym wspólnym miejscem do przechowywania jest Blue Ray, który z grubsza da ci 40 Gb. Będziesz potrzebował kompresji 25 do 1 danych, aby dopasować się do tego. Jeśli Twoja strona trzecia ma tylko DVD, potrzebujesz 125: 1 (z grubsza).

Jeśli nie możesz dopasować tych numerów kompresji, po prostu użyj zwykłego dysku, skopiuj go i wyślij pocztą elektroniczną do innej firmy. W takim przypadku wysyłanie czegoś mniejszego niż dysk 1 TB, który wymagałby kompresji, jest szaleństwem.

Musisz tylko porównać to z użyciem ssh -C(kompresja standardowa) lub najlepiej rsyncz kompresją do kopiowania plików przez sieć, bez konieczności kompresji i tarowania z góry. 1 TB nie jest niemożliwe, aby przejść przez sieć, ale zajmie to trochę czasu.

Anthon
źródło
5
+1: „nigdy nie lekceważ przepustowości wozu kombi pełnego taśm pędzących po autostradzie” (Andrew S. Tanenbaum). patrz en.wikipedia.org/wiki/Sneakernet
Olivier Dulac
@OlivierDulac Widziałem podobne konstrukcje z Boeingiem 747 i pudełkami pełnymi CDROM-ów. To niesamowite, jaką przepustowość można uzyskać przy tym.
Anthon
Uwielbiam to, że pidgin pokonał ISP długim strzałem, zobacz przykłady na stronie wikipedii ^^
Olivier Dulac
6

Czy rozważałeś torrent? Peer-to-Peer może być najlepszą opcją dla transferu przez Internet:

  • Przynajmniej tak szybko, jak inne transfery internetowe: prędkość wysyłania określa szybkość przesyłania
  • Brak uszkodzenia danych
  • Wybierz, które pliki najpierw przesłać
  • Nie jest potrzebne dodatkowe miejsce do przechowywania w chmurze lokalnej
  • Darmowy

Nie powiedziałeś, jakiego systemu operacyjnego używasz, ale kiedy mówisz o kompresji tar.gz, założę się, że używasz systemu operacyjnego typu GNU / Linux. W tym celu zasugeruję transmisję . Jest to oprogramowanie torrentowe typu open source działające na komputerach Mac i Linux. Podoba mi się, ponieważ programiści starają się, aby był natywny dla wszystkich obsługiwanych klientów GUI: brak języka międzyplatformowego.

Możesz połączyć tę metodę z kompresją, ale stracisz możliwość ustalania priorytetów części transferu.

Niedbały
źródło
Oprogramowanie Torrent prawdopodobnie ma takie same problemy z kompresowaniem oprogramowania GUI. Przechowywanie nazw plików w pamięci itp. Ponadto pliki torrent muszą przechowywać metadane plików. 5 milionów nazw plików powinno być spakowanych do pliku torrent.
Ayesh K
@AyeshK To prawda, że ​​wpłynie to na wydajność podczas dodawania / tworzenia torrenta lub sprawdzania sum kontrolnych. Mimo to uważam, że jest to najbardziej stabilne rozwiązanie do przesyłania dużej ilości danych.
LaX
Według maniaka torrentów największy torrent, jaki kiedykolwiek udostępniono, to ~ 800 GB. Pojedynczy plik torrent z większością plików zawiera około 33 000 plików. Ale 5 milionów plików ... Nie jestem pewien.
Ayesh K
3

7z będzie moim wyborem. Umożliwia automatyczne dzielenie archiwów i obsługuje kompresję wielowątkową. Nie, xznie, pomimo tego, co mówi komunikat pomocy. Spróbuj z:

7za a -v100m -m0=lzma2 -mx=9 -ms=on -mmt=$THREADS archive.7z directory/

Wyjście jest podzielone na 100 MB bloków (zmień to -vprzełącznikiem).

Jedynym minusem jest to, że 7z nie zachowuje metadanych uniksowych (np. Uprawnień i właściciela). Jeśli trzeba, że rury tarwyjścia do 7zazamiast (patrz man 7zakilka przykładów).

Stefano Sanfilippo
źródło
1
The only real downsideale co za minus!
njzk2
@ njzk2 tak naprawdę zależy to od scenariusza. Na przykład, jeśli wysyłasz obrazy zapasowe lub zrzuty bazy danych, prawdopodobnie nie przejmujesz się uprawnieniami.
Stefano Sanfilippo
Nie do końca rozumiem sensu używania 7z do dzielenia, kiedy można go użyć splitw pliku .tar.gz i zachować metadane.
njzk2
@ njzk2 to również dzieli. Przede wszystkim ma wielowątkową kompresję z LZMA2. Żadne inne narzędzie uniksowe, o którym wiem, nie obsługuje tego. 7z ma także tryb kompresji niesolidnej, co jest wielkim krokiem naprzód, gdy tylko tarpodejście do określonego pliku musi być dostępne .
Stefano Sanfilippo
3

Kliknąłem folder prawym przyciskiem myszy, kliknąłem „Utwórz archiwum” i wybrałem opcję .tar.gz. Struktura katalogów jest głęboka, ponad 500 000 katalogów

Tak, powodzenia w pakowaniu. Narzędzie GUI spróbuje to zrobić na tym samym woluminie, co oznacza, że ​​a) potrzebujesz jeszcze 1 TB wolnego miejsca ib) przewrotne czytanie jednego pliku i dołączanie go do archiwum nie będzie zbyt zdrowe dla dysku.

Widzę dwie możliwości:

1) rsync z komputera na stronę trzecią. Jeden lub drugi będzie potrzebował globalnego adresu IP, który nie zmienia się często. Ogromna zaleta rsync jest jeśli masz przerwany z jakiegokolwiek powodu, można go odebrać w którym zostało przerwane. Kopiowanie tarballa 1 TB albo zakończy się sukcesem, albo niepowodzeniem

2) kup dysk zewnętrzny o pojemności 1 TB, skopiuj na niego pliki i dostarcz dysk. Duże opóźnienia, ale naprawdę dobra przepustowość, gdy przybywa. Różne usługi tworzenia kopii zapasowych online tego do początkowej kopii zapasowej.

Paweł
źródło
1
Obowiązkowe XKCD .
PythonNut
1

Proponuję użyć czegoś takiego:

tar -c -L 104857600 -f file1.tar -f file2.tar -f file3.tar -f file4.tar -f file5.tar -f file6.tar -f file7.tar -f file8.tar -f file9.tar -f file10.tar 
gzip file*.tar

który utworzy 10 plików o maksymalnej wielkości 100 GB. Ale to nie rozwiązałoby problemu z „OOM”, ponieważ tar ma przesyłać strumieniowo swoje dane do odczytu / zapisu, więc wąskie gardło jest oczywiście gzip.

mveroone
źródło
0

Co ty na to:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find przeszukuje listę drzewa katalogów
  • tar -T - czyta listę ze standardowego wejścia
  • -czf -tworzy archiwum i zapisuje na standardowe wyjście, zzgzipuje strumień
  • ssh remotehost zaloguj się do zdalnego hosta za pomocą ssh
  • cd /target/dir/ przejdź do katalogu docelowego
  • tar xzf - wyodrębnij strumień przychodzący ze standardowego wejścia
chaos
źródło
Miły mały fragment. Chociaż myślę, że jego potrzebą jest przede wszystkim funkcja kompresji, ponieważ celem jest „przeniesienie do przyjaciela”
mveroone
Niepełne utworzenie archiwum zaszkodzi, gdy połączenie zostanie przerwane, co nie jest całkowicie mało prawdopodobne podczas przesyłania 1 TB, albo z powodu awarii sieci (nadal istnieją dostawcy usług internetowych, którzy rozłączają cię co 24 godziny) lub z innych powodów.
Jonas Schäfer