Çok sayıda küçük dosyayı sıkıştırırken ve aktarırken bellek sorunları (toplamda 1 TB)


15

Yaklaşık 1 TB depolama alanı kaplayan 5 milyon dosyam var. Bu dosyaları üçüncü bir tarafa aktarmam gerekiyor.

Bunu yapmanın en iyi yolu nedir? Boyutu .tar.gz kullanarak küçültmeyi denedim, ancak bilgisayarımda 8GB RAM olsa bile, "sistem belleği yetersiz" hatası alıyorum.

Dosyaları salyangozla göndermek için en iyi çözüm mü?


9
.tar.gzOluşan sıkıştırılmış dosyayı OLUŞTURMA veya KOPYALAMA sorunlarınız mı var ? Her iki durumda da, bir şey tuhaf, çünkü her iki işlem de dosyalar büyük olduğu için daha fazla bellek tüketmemelidir. Yani, her iki işlem de akış halinde olmalıdır. Lütfen tam olarak hangi komutların başarısız olduğu hakkında daha fazla bilgi ekleyin.
Celada

1
Siz ve üçüncü tarafın ne kadar bant genişliği ayıracaksınız? Saf bir rsync sizi posta ücretinden kurtarabilir. Ancak "beş milyon" dosyanın sizin için nasıl çalışacağını bilmiyorum, çünkü rsync filelistleri bellekte oluşturmaya çalışacak ve eğer liste (5e6 dosya)> 8 GB olabilir. Ve tabii ki yavaş olacak.
Kalvin Lee

2
@oshirowanen Dosya listesini hesaplamak için bir sürü bellek tüketmesi gerektiğini düşünmüyorum çünkü tardosyaları listelediğinde art arda arşivlemeli, asla bellekte bir liste oluşturmamalıyım. Ama yine, lütfen tam olarak kullandığınız komutu gösterin. Ayrıca, tüm dosyalar aynı dizinde mi yoksa dizin yapısı çok derin mi?
Celada

3
Evet, iyi GUI programları genellikle ölçeklenebilirlik ve sağlamlık gibi hedeflere fazla önem vermeden oluşturulur. GUI sarıcı / ön ucunun hatası ise beni şaşırtmaz. Komut satırını kullanarak dosyayı oluşturun ve bence gayet iyi çalışıyor.
Celada

3
1 TB veri 100 Mbit / s geniş bant bağlantı üzerinden aktarılırken en az 22 saat sürecektir. Bu nedenle, ne kadar sıkıştırma elde etmeyi beklediğinize bağlı olarak, salyangoz posta aslında daha hızlı bir seçenek olabilir.
Dan

Yanıtlar:


27

Yorumlarda sağlanan ek bilgiler, OP'nin .tar.gzdosyayı oluşturmak için bir GUI yöntemi kullandığını gösterir .

GUI yazılımı genellikle eşdeğer komut satırı eşdeğer yazılımından çok daha fazla şişkinlik içerir veya ilerleme çubuğu gibi bazı "ekstra" özellikler uğruna ek gereksiz görevler gerçekleştirir. GUI yazılımı bellekteki tüm dosya adlarının bir listesini toplamaya çalışıyorsa beni şaşırtmaz. Arşiv oluşturmak için bunu yapmak gereksizdir. Özel araçlar tarve gzipkesinlikle giriş ve çıkış akışıyla çalışmak üzere tasarlanmıştır, bu da giriş ve çıkış ile bellekten çok daha büyük başa çıkabilecekleri anlamına gelir.

GUI programından kaçınırsanız, büyük olasılıkla bu arşivi aşağıdaki targibi tamamen normal bir günlük çağırma kullanarak oluşturabilirsiniz :

tar czf foo.tar.gz foo

foo5 milyon dosyanızın tümünü içeren dizin nerede ?

Bu sorunun diğer cevapları tar, sonucu birden fazla parçaya bölmek istemeniz durumunda size birkaç ek alternatif komut verir.


15

"beş milyon" dosya ve toplamda 1 TB? Dosyalarınız çok küçük olmalıdır. Sadece denerdim rsync:

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

Buna sahip değilseniz - veya kullanım durumunuz kullanılmasına izin vermiyorsa rsync, en azından 7zverilerinizle çalışıp çalışmadığını kontrol ederdim . Değil, ama yine de denemeye değer olduğunu düşünüyorum:

7z a archive.7z /source/dir

Ya da 7zen azından bir .tar.xzarşiv oluşturmayı denemekten çekinmeyin :

tar cJv archive.tar.xz /source/dir

( anahtarın eski sürümlerinin arşiv taroluşturmadığı .tar.xz, ancak anahtarın .tar.lzmakullanıldığı arşivler olduğu belirtilmelidir J. Henüz eski sürümleri bile bayrağı tamamen tardesteklemez J.)


Bu dosyaları oluşturmak için bir GUI programı kullandığınızdan, bir komut satırı arayüzü kullanmaktan biraz rahatsız olduğunuzu varsayıyorum.

Komut satırı arabiriminden arşivlerin oluşturulmasını, yönetimini ve çıkarılmasını kolaylaştırmak için, adlandırılan küçük yardımcı program vardır atool. Neredeyse gördüğüm her ortak dağıtım için kullanılabilir ve umutsuzca gizlenmedikçe, tökezlediğim her arşivde hemen hemen çalışır.

Dağıtımınızın atooldepolarında olup olmadığını kontrol edin veya bir işyeri ortamındayken yöneticinizden yüklemesini isteyin.

atool kendi kendine bir sürü sembol takar, bu nedenle paketleme ve ambalajı açmak çok kolaydır:

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

Bir arşiv oluşturur.

aunpack archive.7z

Arşivi genişletir.

als archive.rar

Dosya içeriğini listeler.

Ne tür bir arşiv oluşturulduğunu, arşivinizin atooldosya adı uzantısıyla komut satırında olduğunu keşfeder.


4
Burada kullanmanın avantajı rsync, eğer bağlantı koparsa (kaldığı zaman) rsynckaldığı yerden devam edebilmesidir.
roaima

2
Dosyalar ortalama 200 KB olacaktır. Hepsi bu kadar küçük değil.
Nate Eldredge

4
@NateEldredge Genellikle büyük olanı 1GB'den büyük bir anlam olarak düşünüyorum. Küçük genellikle <1 MB'dir. Çok küçük.
PythonNut

8

Üçüncü tarafla değiştirebileceğiniz bazı donanım bandı formatınız yoksa, 25: 1'den daha iyi sıkıştırma yapamazsanız, salyangoz postalamadan önce bunu sıkıştırmaktan herhangi bir şey kazanmanız olası değildir.

En büyük ortak depolama mavi ışın ve kabaca 40Gb alacak. Buna uyması için verilerinizde 25'e 1 sıkıştırma gerekir. Üçüncü tarafınızda yalnızca DVD varsa 125: 1 (kabaca) gerekir.

Bu sıkıştırma numaralarıyla eşleşemiyorsanız, normal bir disk kullanın, bunu üçüncü tarafa kopyalayın ve salyangozla gönderin. Bu durumda, sıkıştırmaya ihtiyaç duyan 1 TB'lık bir sürücüden daha küçük bir şey göndermek deliliktir.

Sadece ağ üzerinden kopyalamak için ssh -C(standart sıkıştırma) veya tercihen rsyncsıkıştırma ile karşılaştırmanız yeterlidir, sıkıştırmaya ve öne katlanmaya gerek yoktur. 1Tb ağ üzerinde hareket etmek imkansız değil, ama biraz zaman alacak.


5
+1: "otoyolda aşağıya vuran bantlarla dolu bir istasyon vagonunun bant genişliğini asla küçümsemeyin" (Andrew S. Tanenbaum). bkz. en.wikipedia.org/wiki/Sneakernet
Olivier Dulac

@OlivierDulac Boeing 747 ve CDROM'larla dolu kutular ile benzer yapılar gördüm, bununla ne tür bir verim alabileceğiniz şaşırtıcı.
Anthon

Bir pidgin'in ISS'yi uzun bir atışla yendiğini seviyorum, wikipedia sayfasının örneklerine bakın ^^
Olivier Dulac

6

Torrent'i düşündün mü? Peer-to-Peer, internet üzerinden aktarım için en iyi seçenek olabilir:

  • En az diğer internet aktarımları kadar hızlı: yükleme hızınız aktarım hızını belirleyecektir
  • Veri bozulması yok
  • Önce hangi dosyaları aktaracağınızı seçin
  • Ek yerel / bulut depolama alanı gerekmez
  • Bedava

Hangi işletim sistemini kullandığınızı söylemediniz, ancak tar.gz sıkıştırması hakkında konuşurken, GNU / Linux benzeri bir işletim sistemi kullandığınızı varsayacağım. Bunun için İletimi öneririm . Mac ve Linux üzerinde çalışan açık kaynaklı bir torrent yazılımıdır. Bunu seviyorum çünkü geliştiriciler, destekledikleri her GUI istemcisine yerel hale getirmek için çaba harcadı: çapraz platform dili yok.

Bu yöntemi sıkıştırma ile birleştirebilirsiniz, ancak aktarımın bölümlerine öncelik verme yeteneğini kaybedersiniz.


Torrent yazılımı GUI yazılımının sıkıştırılmasında muhtemelen aynı sorunlara sahiptir. Dosya adlarının belleğe kaydedilmesi vb. Ayrıca, torrent dosyalarının dosyaların meta verilerini depolaması gerekir. 5 milyon dosya adı torrent dosyasına paketlenmelidir.
Ayesh K

@AyeshK Doğru, bu torrent eklerken / oluştururken veya sağlama toplamlarını kontrol ederken performansı etkileyecektir. Yine de, bunun büyük miktarda veri aktarımı için en kararlı çözüm olduğuna inanıyorum.
LaX

Torrent ucube göre, şimdiye kadar paylaşılan en büyük torrent ~ 800gb. Çoğu dosyayı içeren tek torrent dosyası yaklaşık 33K dosya içerir. Ama 5 milyon dosya ... Emin değilim.
Ayesh K

3

7z benim seçimim olurdu. Arşivlerin otomatik olarak bölünmesini sağlar ve çok iş parçacıklı sıkıştırmayı destekler. Hayır, xzyardım mesajının söylediklerine rağmen değil. Şunu deneyin:

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

Çıktı 100 MB'lık bloklara bölünür ( -vanahtarla değiştirin).

Tek gerçek dezavantajı, 7z'nin unix meta verilerini tutmamasıdır (örneğin, izinler ve sahip). Buna ihtiyacınız varsa, bunun yerine boru tarçıkışı 7za( man 7zabazı örnekler için bakınız ).


1
The only real downsideama ne dezavantajı!
njzk2

@ njzk2 aslında senaryoya bağlıdır. Örneğin, yedek imajlar veya veritabanı dökümleri gönderiyorsanız, büyük olasılıkla izinleri pek önemsemezsiniz.
Stefano Sanfilippo

splitBir .tar.gz dosyasında kullanabileceğiniz ve meta verileri saklayabileceğiniz zaman, bölme için 7z kullanma noktasını görmüyorum .
njzk2

@ njzk2 de böler. Öncelikle LZMA2 ile çok iş parçacıklı sıkıştırmaya sahiptir. Başka hiçbir unix yardımcı programı desteklediğini biliyorum. Şekil 7z, katı olmayan bir sıkıştırma moduna da sahiptir, bu da taryaklaşıma sadece belirli bir dosyaya erişmek gerektiğinde ileriye doğru atılmış büyük bir adımdır .
Stefano Sanfilippo


3

Klasörü sağ tıklayıp "arşiv oluştur" u tıklayıp .tar.gz seçeneğini seçtim. Dizin yapısı derin, 500.000'den fazla dizin

Evet, bunu paketlemek için iyi şanslar. Ve GUI aracı bunu aynı birimde yapmaya çalışacaktır, yani a) başka bir 1 TB'lık boş alana ihtiyacınız vardır ve b) bir dosyayı okuduktan ve arşive eklemek başın sürücü için çok sağlıklı olmayacağı anlamına gelir.

İki olasılık görüyorum:

1) bilgisayarınızdan 3. tarafa rsync. Birinin ya da diğerinin sık sık değişmeyen global bir IP adresine ihtiyacı olacaktır. Dev rsync avantajı herhangi bir nedenle kesintiye olsun eğer kaldığı yerden, bu alabilirsiniz olduğunu. 1 TB'lık bir tarball'ı kopyalamak başarılı veya başarısız olur

2) 1 TB harici sürücü satın alın, bir şeyleri ona kopyalayın ve sürücünün teslim edilmesini sağlayın. Yüksek gecikme süresi, ancak geldiğinde gerçekten iyi bant genişliği. İlk yedekleme için çeşitli çevrimiçi yedekleme hizmetleri.



1

Şöyle bir şey kullanmanızı öneririm:

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

en fazla 100 GB büyük olacak 10 dosya oluşturur. Ancak bu, "OOM" sorununa cevap vermez, çünkü katranın okuma / yazma akışını beklemesi gerekir, böylece darboğaz açıkça gzip olur.


0

Peki ya bu:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find aramalar dizin ağacını listeler
  • tar -T - listeyi stdin'den okur
  • -czf -bir arşiv oluşturur ve stdout'a yazar z, akışı sıkıştırır
  • ssh remotehost kullanarak uzaktan ana bilgisayara giriş ssh
  • cd /target/dir/ hedef dizine geç
  • tar xzf - gelen akışı stdin'den çıkart

Güzel küçük snippet. Her ne kadar burada ihtiyacı çoğunlukla sıkıştırma özelliği olduğunu düşünüyorum rağmen, çünkü amacı "bir arkadaşına transfer"
mveroone

Arşiv kesildiğinde, ağ kesintisi (hala 24 saatte bir bağlantıyı kesen İSS'ler vardır) veya diğer nedenlerden dolayı 1 TB aktarılırken pek olası olmayan arşiv kesildiğinde zarar vermeyecektir.
Jonas Schäfer

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.