Threaded wget - minimiser les ressources
Question
J'ai un script qui récupère les emplacements GeoIP de divers ips. Il est exécuté quotidiennement et je m'attendrai à avoir environ 50 000 ips à rechercher.
J'ai mis en place un système GeoIP. Je voudrais simplement éviter de devoir exécuter wget 50 000 fois par rapport.
Ce que je pensais, c’est qu’il doit exister un moyen de permettre à wget d’ouvrir une connexion avec l’url - puis de transmettre l’ip, pour ne pas avoir à rétablir la connexion.
Toute aide sera très appréciée.
La solution
Si vous donnez à wget
plusieurs adresses à la fois, avec des adresses consécutives appartenant au même serveur HTTP / 1.1 ( Connexion: keep-alive
), wget
réutilisera la connexion déjà établie.
S'il y a trop d'adresses à répertorier sur la ligne de commande, vous pouvez les écrire dans un fichier et utiliser l'option -i
/ - input-file =
. (et, conformément à la tradition UNIX, -i -
/ - fichier_entrée = -
lit les entrées standard).
Il n’existe toutefois aucun moyen de conserver une connexion entre différents appels wget
.
Autres conseils
Vous pouvez également écrire un script Ruby threadé pour exécuter wget sur plusieurs fichiers d'entrée simultanément afin d'accélérer le processus. Donc, si vous avez 5 fichiers contenant chacun 10 000 adresses, vous pouvez utiliser ce script:
#!/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 }
Chacune de ces discussions utiliserait une connexion pour télécharger toutes les adresses d’un fichier. La commande suivante ne signifie alors que 5 connexions au serveur pour télécharger les 50 000 fichiers.
./fetch.rb "list1.txt" "list2.txt" "list3.txt" "list4.txt" "list5.txt"
Vous pouvez également écrire un petit programme (en Java, C ou autre) qui envoie la liste de fichiers sous forme de requête POST et le serveur renvoie un objet contenant des données à leur sujet. Ne devrait pas être trop lent non plus.