Unix'te paralel kopya oluşturmanın en iyi yolu nedir?


18

Bir ağ dosya sistemindeki bir klasörün içeriğini rutin olarak yerel bilgisayarıma kopyalamam gerekiyor. Uzak klasörde nispeten küçük olan birçok dosya (1000'ler) var, ancak ağ yükü nedeniyle normal bir kopya cp remote_folder/* ~/local_folder/çok uzun zaman alıyor (10 dakika).

Ben dosyaları sırayla kopyalanıyor çünkü inanıyorum - her dosya kopyalama başlamadan önceki bitene kadar bekler.

Bu kopyanın hızını artırmanın en basit yolu nedir? (Kopyayı paralel yapmak olduğunu varsayıyorum.)

Kopyalamadan önce dosyaları sıkıştırmak her şeyi hızlandırmayabilir, çünkü hepsi farklı sunuculardaki farklı disklere kaydedilebilir.


Kopyalamadan önce dosyaları sıkıştırmak işleri büyük ölçüde hızlandıracaktır, çünkü artık "bu dosyayı aldınız mı", "evet, yaptım", "bir sonraki", "tamam", ... Bunlar sizi yavaşlatan "geri dönüşler".
David Schwartz

Muhtemelen ağ hızı yerine disk hızıdır, bu sizin sınırlayıcı faktörünüzdür ve eğer durum buysa, bunu dosya başına paralel yapmak işlemi daha hızlı değil, daha hızlı yapacaktır, çünkü diski sürekli olarak ileri geri aramaya zorlayacaksınız dosyalar arasında.
Joel Coehoorn

Sıkıştırma iyi bir fikir olmayabilir (sıkıştırma dosyalarının 1000'lerin üzerinde çalıştırılması biraz zaman alabilir), katran uygulanabilir olabilir.
Rob

@JoelCoehoorn yine de, bunun böyle olmadığı durumlar vardır: örneğin çoklu iğ + küçük dosyalar (veya sadece rastgele okumalar). Bu senaryoda, "paralel cp" yardımcı olacaktır.
CAFxX

Yanıtlar:


8

Çalıştırdığınız kopyalama komutlarını sınırladığınız sürece, muhtemelen Scrutinizer tarafından gönderilen gibi bir komut dosyası kullanabilirsiniz.

SOURCEDIR="$1"
TARGETDIR="$2"
MAX_PARALLEL=4
nroffiles=$(ls "$SOURCEDIR" | wc -w)
setsize=$(( nroffiles/MAX_PARALLEL + 1 ))
ls -1 "$SOURCEDIR"/* | xargs -n "$setsize" | while read workset; do
  cp -p "$workset" "$TARGETDIR" &
done
wait

1
Yine de uyarı notu: Bu komut dosyası , boşluklar veya yırtıcı karakterler içeren dosya adlarıyla kesiliyor .
slhck

@OldWolf - Bu komut dosyasının nasıl çalıştığını açıklayabilir misiniz? Örneğin, paralellik hangi kısımda?
dsg

3
@ dsg: Komutun &sonunda cp, whiledöngünün bir sonraki cp komutunu beklemeden devam etmesini ve başlatmasını sağlar. xargsKomut 4 (MAX_PARALLEL) grupları olarak dosya geçen whiledöngü.
RedGrittyBrick

Benim için çalışmadı. Hızlanmanın mümkün olduğundan emin değilim cp. Çok iş parçacığı aracılığıyla hesaplamayı açık bir şekilde hızlandırabilirsiniz . Ama aynı şey sabit disk veri başa çıkma için de geçerli değil.
Adobe

9

GNU Parallel http://www.gnu.org/software/parallel/ yüklüyse bunu yapabilirsiniz:

parallel -j10 cp {} destdir/ ::: *

GNU Parallel'ı aşağıdaki yöntemlerle kurabilirsiniz:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh

Daha fazla bilgi edinmek için GNU Parallel için tanıtım videolarını izleyin: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


3

Bunun bir yolu sadece değişiklikleri kopyalayacak olan rsync'i kullanmaktır - yeni dosyalar ve diğer dosyaların değiştirilmiş parçaları.

http://linux.die.net/man/1/rsync

Herhangi bir paralel kopyalama işlemi çalıştırmak muhtemelen ağınızı sular altında tutar ve kopyalama işlemi sadece durma noktasına gelir veya kaynak veya hedef diskteki darboğazlardan muzdarip olur.


2

Dürüst olmak gerekirse, en iyi araç Google'ın gsutil'idir. Dizin özyineleme ile paralel kopyaları işler. Gördüğüm diğer yöntemlerin çoğu dizin özyinelemesini işleyemiyor. Yerel dosya sisteminden dokümanlarındaki yerel dosya sistemi kopyalarına özel olarak değinmezler, ancak bir cazibe gibi çalışır.

Yüklemek için başka bir ikili dosya, ancak bugünlerde tüm bulut hizmeti benimsemeyi göz önünde bulundurarak muhtemelen çalıştırabileceğiniz bir ikilidir.


2

Find kullanarak paralel rsync:

export SOURCE_DIR=/a/path/to/nowhere
export DEST_DIR=/another/path/to/nowhere

# sync folder structure first
rsync -a -f'+ */' -f'- *' $SOURCE_DIR $DEST_DIR

# cwd
cd $SOURCE_DIR

# use find to help filter files etc. into list and pipe into gnu parallel to run 4 rsync jobs simultaneously
find . -type f | SHELL=/bin/sh parallel --linebuffer --jobs=4 'rsync -av {} $DEST_DIR/{//}/'

kurumsal bir LAN'da tek rsync yaklaşık 800Mbps; 6-8 iş ile (yüksek yük pahasına) 2.5Gbps üzerinde almak mümkün. Diskler tarafından sınırlandırılmıştır.


0

Sahip olduğunuz topolojiye bağlı olarak dikkate alınması gereken birçok şey vardır. Ancak karmaşık çözümleri düşünmeye başlamadan önce, görevi iki işe bölmeyi deneyebilir ve gereken sürenin önemli ölçüde azalıp azalmayacağını kontrol edebilirsiniz:

Bir dahaki sefere deneyin:

  cp remote_folder/[a-l]* ~/local_folder/ &
  cp remote_folder/[!a-l]* ~/local_folder/ &
  wait
  wait

([al] * yerine klasörün içeriğine bağlı olarak dosyaların yaklaşık yarısıyla (belki [0-4] *) eşleşen başka bir şey koymak isteyebilirsiniz)

Zaman önemli ölçüde iyileşmezse, tüm dosyaların kopyalanmasının gerekli olup olmadığını kontrol etmek daha önemli olabilir (değiştirilen dosyaların tüm dosyalara oranı nedir?)

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.