我通常必须将网络文件系统上文件夹的内容复制到本地计算机上。远程文件夹上有许多文件(1000个),它们都相对较小,但是由于网络开销,常规副本cp remote_folder/* ~/local_folder/
需要很长时间(10分钟)。
我相信这是因为文件是按顺序复制的-每个文件都等到前一个文件完成后才开始复制。
提高此副本速度的最简单方法是什么?(我假设它是并行执行复制的。)
在复制之前压缩文件并不一定会加快处理速度,因为它们可能全部保存在不同服务器上的不同磁盘上。
我通常必须将网络文件系统上文件夹的内容复制到本地计算机上。远程文件夹上有许多文件(1000个),它们都相对较小,但是由于网络开销,常规副本cp remote_folder/* ~/local_folder/
需要很长时间(10分钟)。
我相信这是因为文件是按顺序复制的-每个文件都等到前一个文件完成后才开始复制。
提高此副本速度的最简单方法是什么?(我假设它是并行执行复制的。)
在复制之前压缩文件并不一定会加快处理速度,因为它们可能全部保存在不同服务器上的不同磁盘上。
Answers:
只要限制正在运行的复制命令,就可以使用脚本,例如Scrutinizer发布的脚本。
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
&
末尾的@ cp
允许while
循环继续并无需等待就启动下一个cp命令。该xargs
命令将文件名以4组(MAX_PARALLEL)的形式传递给while
循环。
cp
。您显然可以通过多线程来加快计算速度。但是我不认为硬盘数据处理同样适用。
如果您安装了GNU Parallel http://www.gnu.org/software/parallel/,则可以执行以下操作:
parallel -j10 cp {} destdir/ ::: *
您可以通过以下方式简单地安装GNU Parallel:
$ (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
观看GNU Parallel的介绍视频以了解更多信息:https : //www.youtube.com/playlist?list=PL284C9FF2488BC6D1
一种方法是使用rsync,它将仅复制更改-新文件和其他文件的更改部分。
http://linux.die.net/man/1/rsync
运行任何形式的并行复制操作可能会淹没您的网络,并且复制操作只会陷入停顿或遭受源磁盘或目标磁盘瓶颈的困扰。
使用find并行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/{//}/'
在企业局域网上,单个rsync的速度约为800Mbps;通过6-8个工作,我能够获得超过2.5Gbps的速度(以高负载为代价)。受磁盘限制。