Резьбовой wget - минимизация ресурсов
Вопрос
У меня есть скрипт, который получает GeoIP-местоположения различных ips, он запускается ежедневно, и я собираюсь ожидать около 50 000 ips для просмотра. Р>
У меня настроена система GeoIP - я просто хотел бы избежать необходимости запускать wget 50 000 раз за отчет.
Я думал о том, что должен быть какой-то способ, чтобы wget открывал соединение с URL-адресом - затем передавал ips, таким образом, не нужно восстанавливать соединение.
Любая помощь будет высоко ценится.
Решение
Если вы даете wget
несколько адресов одновременно, причем последовательные адреса принадлежат одному и тому же серверу поддержки HTTP / 1.1 ( Connection: keep-alive
), wget
будет повторно использовать уже установленное соединение.
Если в командной строке слишком много адресов для перечисления, вы можете записать их в файл и использовать опцию -i
/ - input-file =
(и, согласно традиции UNIX, -i -
/ - input-file = -
считывает стандартный ввод).
Однако нет способа сохранить соединение между различными вызовами wget
.
Другие советы
Вы также можете написать многопоточный скрипт Ruby для одновременного запуска wget на нескольких входных файлах для ускорения процесса. Поэтому, если у вас есть 5 файлов, содержащих по 10 000 адресов каждый, вы можете использовать этот скрипт:
#!/usr/bin/ruby
threads = []
for file in ARGV
threads << Thread.new(file) do |filename|
system("wget -i #{filename}")
end
end
threads.each { |thrd| thrd.join }
Каждый из этих потоков будет использовать одно соединение для загрузки всех адресов в файле. Следующая команда означает только 5 подключений к серверу для загрузки всех 50 000 файлов.
./fetch.rb "list1.txt" "list2.txt" "list3.txt" "list4.txt" "list5.txt"
Вы также можете написать небольшую программу (на Java, C или любом другом), которая отправляет список файлов в виде запроса POST, а сервер возвращает объект с данными о них. Не должно быть слишком медленным.