2017-02-15 18 views
1

Я ВОССТАНОВЛЕНИЕ большое количество данных с помощью wget, с помощью следующей команды:HTTP запросов в Wget принимая большую часть времени

wget --save-cookies ~/.urs_cookies --load-cookies ~/.urs_cookies --keep-session-cookies --content-disposition -i links.dat 

Моя проблема заключается в том, что links.dat содержит тысячи ссылок. Файлы относительно малы (100kb). Поэтому для загрузки файла требуется 0,2 с, а 5s - для ответа HTTP-запроса. Таким образом, это заканчивается тем, что занимает 14 часов, чтобы загрузить все мои данные, большую часть времени, ожидая запросов.

URL transformed to HTTPS due to an HSTS policy 
--2017-02-15 18:01:37-- https://goldsmr4.gesdisc.eosdis.nasa.gov/daac-bin/OTF/HTTP_services.cgi?FILENAME=%2Fdata%2FMERRA2%2FM2I1NXASM.5.12.4%2F1980%2F01%2FMERRA2_100.inst1_2d_asm_Nx.19800102.nc4&FORMAT=bmM0Lw&BBOX=43%2C1.5%2C45%2C3.5&LABEL=MERRA2_100.inst1_2d_asm_Nx.19800102.SUB.nc4&FLAGS=&SHORTNAME=M2I1NXASM&SERVICE=SUBSET_MERRA2&LAYERS=&VERSION=1.02&VARIABLES=t10m%2Ct2m%2Cu50m%2Cv50m 
Connecting to goldsmr4.gesdisc.eosdis.nasa.gov (goldsmr4.gesdisc.eosdis.nasa.gov)|198.118.197.95|:443... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: 50223 (49K) [application/octet-stream] 
Saving to: ‘MERRA2_100.inst1_2d_asm_Nx.19800102.SUB.nc4.1’ 

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

Если детали помогают, я загружаю данные MERRA-2 для определенных узлов.

Спасибо!

ответ

1

Wget будет повторно использовать существующее соединение для нескольких запросов на один и тот же сервер, что потенциально может сократить время, необходимое для установления и срыва сокета.

Вы можете сделать это, указав несколько URL-адресов в командной строке. Например, чтобы загрузить 100 за пакет:

#!/usr/bin/env bash 

wget_opts=(
--save-cookies ~/.urs_cookies 
--load-cookies ~/.urs_cookies 
--keep-session-cookies 
--content-disposition 
) 

manyurls=() 
while read url; do 
    manyurls+=("$url") 
    if [ ${#manyurls[@]} -eq 100 ]; then 
    wget "${wget_opts[@]}" "${manyurls[@]}" 
    manyurls=() 
    fi 
done < links.dat 

if [ ${#manyurls[@]} -gt 0 ]; then 
    wget "${wget_opts[@]}" "${manyurls[@]}" 
fi 

Обратите внимание, что я не тестировал это. Это может сработать. Если это не так, сообщите мне свою ошибку, и я попытаюсь отладить.

Итак ... это «повторное использование соединения» или «keepalive». Другая вещь, которая ускорит вашу загрузку, - HTTP Pipelining, что в основном позволяет отправить второй запрос до получения первого ответа. wget не поддерживает это, и curl поддерживает его в своей библиотеке, но не в командной строке.

У меня нет готового инструмента, предлагающего поддержку HTTP-конвейеризации. (Кроме того, рекомендации по инструментам не соответствуют теме.) Вы можете видеть, как работает конвейерная обработка в this SO answer. Если вам нравится писать что-то на выбранном вами языке, который поддерживает libcurl, я уверен, что любые трудности, с которыми вы сталкиваетесь, делают еще один интересный дополнительный вопрос StackOverflow.

+0

Большое спасибо, я попробую это. В основном, что вы предоставили, это способ поставить 100 URL-адресов в конце команды? Как работает «wget --options url1 url2 url100»? – Miguel

+0

Да, это именно оно. Я полагал, что 100 - это разумное число - вы, вероятно, не можете поместить их ВСЕ, потому что командная строка будет слишком длинной. Оба wget и curl будут перерабатывать соединение, которое сервер оставляет открытым. Вам не составит труда найти дополнительную документацию о заголовках keepalive, если это будет проблемой. Другое дело, что вы можете запускать несколько 'wget' одновременно. Но выяснение того, как использовать фоновый материал или управлять пулом фоновых функций оболочки, выходит за рамки этого вопроса. – ghoti

+0

Я действительно думаю, что вы получите лучшую производительность с помощью конвейерной обработки, но вам нужно будет написать свое собственное программное обеспечение для его обработки. Комбинируйте конвейерную обработку и пул фоновых виджета или завитушек, и вы получите все преимущества! До тех пор, пока nasa.gov не заблокирует ваш IP-адрес, если он слишком сильно ударит по серверам. – ghoti