2

Мне нужно как можно быстрее загружать множество маленьких страниц. Средний размер одной страницы - 3 КБ. Есть миллионы страниц. Сначала я попробовал curl но это было слишком медленно, возможно потому, что он ждал, пока сервер ответит на запрос, а затем выполнил тот же процесс для следующей страницы.

curl -O "http://website.com/pages/[0000001-1000000].html"

Изменить: После выполнения некоторых тестов я наблюдал эти результаты. Я всегда открыт для большего количества предложений. Я хотел бы улучшить скорость еще больше.

Сравнение 1: (днс против нет днс)

помедленнее:

curl -O "http://website.com/pages/[1-1000].html" -s -S

Быстрее:

curl -O "http://90.111.123.222/pages/[1-1000].html" -s -S

При загрузке большого количества маленьких страниц задержки DNS имеют решающее значение.

Сравнение 2: (с использованием последовательности curl против "seq")

помедленнее:

curl -O "http://90.111.123.222/pages/{1}.html" -s -S ::: $(seq 1 1000)

Быстрее:

curl -O "http://90.111.123.222/pages/[1-1000].html" -s -S

Сравнение 3: (параллельное исполнение)

помедленнее:

time parallel -j 5 curl -O \'"http://90.111.123.222/pages/{1}.html"\'
-S -s ::: $(seq 1 1000)

Быстрее:

( time curl -O "http://90.111.123.222/pages/[1-200].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[201-400].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[401-600].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[601-800].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[801-1000].html" -s -S & )

Кстати, очевидно, что запуск большего количества экземпляров в некоторой степени улучшит скорость обоих методов.

2 ответа2

2

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

curl -O "http://website.com/pages/0[000000-999999].html" &
curl -O "http://website.com/pages/1[000000-999999].html" &
curl -O "http://website.com/pages/2[000000-999999].html" &
...

и так далее.

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

установите его с вашим менеджером пакетов, тогда это будет что-то вроде

parallel -j 10 curl -O "http://website.com/pages/{1}" ::: $(seq -w 1000000)

что намного элегантнее

1

Скачайте и научитесь использовать GNU Parallel
https://www.gnu.org/software/parallel/

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

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