Ускорение рекурсивного FTP

8

Я пытаюсь загрузить данные за год с FTP-сервера NOAA с помощью wget (или ncftpget). Тем не менее, это занимает больше времени, чем следовало из-за накладных расходов FTP (я думаю). Например, эта команда

time wget -nv -m ftp://ftp:email@ftp.ncdc.noaa.gov/pub/data/noaa/2015 -O /weather/noaa/2015

Или аналогично, через ncftpget

ncftpget -R -T -v ftp.ncdc.noaa.gov /weather/noaa/ /pub/data/noaa/2015

Дает результат. 53 минуты на перевод 30М!

FINISHED --2015-01-03 16:21:41--
Total wall clock time: 53m 32s
Downloaded: 12615 files, 30M in 7m 8s (72.6 KB/s)

real    53m32.447s
user    0m2.858s
sys 0m8.744s

Когда я наблюдаю эту передачу, каждый отдельный файл передается довольно быстро (500 КБ / с), но процесс загрузки 12 000 относительно небольших файлов влечет за собой огромные накладные расходы и замедляет весь процесс.

Мои вопросы:

  1. Я правильно оцениваю ситуацию? Я понимаю, что трудно понять, не зная серверов, но действительно ли FTP так много сосет при передаче тонны маленьких файлов?
  2. Есть ли какие-либо настройки для wget или ncftpget, чтобы они могли лучше играть с удаленным FTP-сервером? Или, может быть, какой-то параллелизм?
Том Хейден
источник

Ответы:

6

Вот как я решил решить эту проблему, используя советы других. У NOAA в этом случае есть FTP и ресурс HTTP для этого, так что я написал скрипт, который делает следующее:

  1. ncftpls, чтобы получить список файлов
  2. sed, чтобы завершить пути к полному списку файлов http
  3. aria2c, чтобы быстро загрузить их все

Пример скрипта:

# generate file list
ncftpls ftp://path/to/ftp/resources > /tmp/remote_files.txt

# append the full path, use http
sed -i -e 's/^/http:\/\/www1\.website\.gov\/pub\/data\//' /tmp/remote_files.txt

# download using aria2c
aria2c -i /tmp/remote_files.txt -d /filestore/2015

Это работает намного быстрее и, вероятно, добрее к серверам NOAA. Вероятно, есть даже умный способ избавиться от этого среднего шага, но я пока не нашел его.

Том Хейден
источник
Отличное решение, работает из коробки! Спасибо.
markusN
2
  1. Ваша оценка верна. С точки зрения чистых чисел, накладные расходы замедляют загрузку
  2. Используйте aria2c . Aria2c открывает множество параллельных подключений к серверу ftp, чтобы быстрее загружать набор файлов. Просто убедитесь, что ваш сервер поддерживает несколько одновременных подключений с одного хоста.

В качестве альтернативы, если у вас есть доступ на запись на вашем хосте (в этом случае, я бы предположил, что вы входите в систему анонимно и не имеете доступа на запись), zip / tar файлы перед загрузкой

Outurnate
источник
Если вы можете сжать, это может сделать это еще быстрее.
Ctrl-Alt-Delor
Может ли aria2c поддерживать рекурсивный FTP? Я посмотрел на документацию и не смог найти упоминания об этом, как будто я хочу загрузить всю папку ...
Том Хейден
Однако он не поддерживает это, используя стандартный ftp для перечисления файлов, тогда передача этого списка в aria будет все же быстрее, чем рекурсивного стандартного ftp
Outurnate
@ TomHayden - я не знаю, что вы можете точно, но, конечно, вы можете перечислить папку и скормить ей результаты. Также есть интерфейс RPC, с которым вы можете делать практически все, что угодно. 742: хороший ответ - пришел сюда, чтобы сказать это, но вы победили меня.
mikeserv
@mikeserv спасибо. Реквизиты для поиска RPC
Outurnate
1

Да вы правы. К сожалению, несмотря на то, что спецификации ftp предлагают альтернативный режим передачи, способный собирать несколько файлов через одно соединение для передачи данных, в последний раз, когда я проводил обзор доступного программного обеспечения (которое, по общему признанию, было еще в 1998 году), никто не поддерживал его. Я не думаю, что ситуация изменилась, потому что интерес к ftp был довольно низким. Большинство организаций с такими наборами данных предоставляют доступ к ним через http или в больших архивах, чтобы избежать этой проблемы. Вы должны проверить, если NOAA делает это.

psusi
источник