13

Мне обычно приходится копировать содержимое папки в сетевой файловой системе на мой локальный компьютер. В удаленной папке много файлов (1000 с), которые все относительно малы, но из-за сетевых издержек обычное копирование cp remote_folder/* ~/local_folder/ занимает очень много времени (10 минут).

Я полагаю, что это потому, что файлы копируются последовательно - каждый файл ждет, пока предыдущий не будет закончен, прежде чем начнется копирование.

Какой самый простой способ увеличить скорость этой копии? (Я предполагаю, что это будет выполнять копию параллельно.)

Архивирование файлов перед копированием не обязательно ускорит процесс, поскольку все они могут быть сохранены на разных дисках на разных серверах.

6 ответов6

7

Пока вы ограничиваете команды копирования, которые вы используете, вы, вероятно, можете использовать скрипт, подобный тому, который выложил 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
7

Если у вас установлен GNU Parallel http://www.gnu.org/software/parallel/, вы можете сделать это:

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

Вы можете установить GNU Parallel просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Посмотрите вступительные видео для GNU Parallel, чтобы узнать больше:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

3

Одним из способов будет использование rsync, который будет копировать только изменения - новые файлы и измененные части других файлов.

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

Выполнение любой формы операции параллельного копирования, вероятно, затопит вашу сеть, а операция копирования просто остановится или пострадает от узких мест на исходном или целевом диске.

1

Честно говоря, лучший инструмент - это gsutil от Google. Он обрабатывает параллельные копии с рекурсией каталога. Большинство других методов, которые я видел, не могут справиться с рекурсией каталога. Они специально не упоминают локальную файловую систему к локальным копиям файловой системы в своих документах, но это работает как шарм.

Это еще один двоичный файл для установки, но, вероятно, тот, который вы уже могли запустить, учитывая все современные внедрения облачных сервисов.

0

Есть много вещей, которые нужно учитывать в зависимости от используемой топологии. Но прежде чем начать думать о сложных решениях, вы можете просто попытаться разделить задачу на две работы и проверить, не сократится ли необходимое время:

В следующий раз попробуйте:

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

(вы можете заменить [al] * на что-то еще, что соответствует примерно половине файлов - возможно, [0-4] * - в зависимости от содержимого папки)

Если время не улучшается значительно, может быть более важно проверить, необходимо ли копировать все файлы (каково соотношение измененных файлов ко всем файлам?)

0

Параллельный rsync с использованием find:

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 выполняет около 800 Мбит / с; с 6-8 работами я могу получить более 2,5 Гбит / с (за счет высокой нагрузки). Ограничено дисками.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .