Acelerar FTP recursivo


8

Estoy intentando descargar un año de datos de un servidor FTP de NOAA usando wget (o ncftpget). Sin embargo, toma más tiempo del que debería debido a la sobrecarga de FTP (creo). Por ejemplo, este comando

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

O de manera similar, a través de ncftpget

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

Produce un resultado de. ¡53 minutos para transferir 30M!

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

Cuando veo esta transferencia, cada archivo individual se transfiere con bastante rapidez (500 kb / s), pero el proceso de descarga de 12,000 archivos relativamente pequeños conlleva una enorme cantidad de sobrecarga y ralentiza todo el proceso.

Mis preguntas:

  1. ¿Estoy evaluando la situación correctamente? Me doy cuenta de que es difícil saberlo sin conocer los servidores, pero ¿FTP realmente apesta tanto al transferir toneladas de archivos pequeños?
  2. ¿Hay algún ajuste en wget o ncftpget para permitirles jugar mejor con el servidor FTP remoto? ¿O tal vez algún tipo de paralelismo?

Respuestas:


6

Así es como terminé resolviendo esto usando los consejos de otros. El NOAA en este caso tiene un recurso FTP y un recurso HTTP para esto, así que escribí un script que hace lo siguiente:

  1. ncftpls para obtener una lista de archivos
  2. sed para completar las rutas de archivo a una lista completa de archivos http
  3. aria2c para descargarlos rápidamente a todos

Script de ejemplo:

# 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

Esto se ejecuta mucho más rápido y probablemente sea más amable con los servidores de NOAA. Probablemente haya incluso una forma inteligente de deshacerse de ese paso intermedio, pero aún no lo he encontrado.


Excelente solución, funciona fuera de la caja! Gracias.
markusN

2
  1. Tu valoración es correcta. Desde un punto de vista de números puros, la sobrecarga está ralentizando la descarga
  2. Usa aria2c . Aria2c abre muchas conexiones paralelas al servidor ftp para descargar un conjunto de archivos más rápido. Solo asegúrese de que su servidor admita múltiples conexiones simultáneas desde el mismo host

Alternativamente, si tiene acceso de escritura en su host (en este caso, supongo que está iniciando sesión de forma anónima y no tiene acceso de escritura) comprima los archivos antes de descargarlos.


Si puede comprimir también, esto puede hacerlo aún más rápido.
ctrl-alt-delor

¿Puede aria2c soportar FTP recursivo? Miré la documentación y no pude encontrar una mención de esto, como si quisiera descargar una carpeta completa ...
Tom Hayden

Sin embargo, no lo admite, usar ftp estándar para enumerar archivos, luego pasar esa lista a aria aún será más rápido que ftp estándar recursivo
Outurnate el

@TomHayden: no sé si puedes exactamente, pero ciertamente puedes enumerar una carpeta y alimentarla con los resultados. También está la interfaz RPC con la que puedes hacer prácticamente cualquier cosa. 742: buena respuesta: vine aquí para decir esto pero me ganaste.
mikeserv

@mikeserv gracias. Props para encontrar el RPC
Outurnate

1

Sí, estás en lo correcto. Desafortunadamente, aunque las especificaciones ftp ofrecen un modo de transferencia alternativo que es capaz de multiplicar múltiples archivos a través de una sola conexión de datos, la última vez que hice una encuesta del software disponible (que ciertamente fue en 1998), ninguno lo admitió. No creo que la situación haya cambiado porque el interés en ftp ha sido bastante bajo. La mayoría de las organizaciones con tales conjuntos de datos les proporcionan acceso a través de http, o en archivos más grandes para evitar este problema. Debe verificar si NOAA hace esto.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.