質問
さまざまなIPのGeoIPロケーションを取得するスクリプトがあります。これは毎日実行され、ルックアップするのに約50,000 IPがあると予想されます。
GeoIPシステムをセットアップしています。レポートごとに50,000回wgetを実行する必要をなくしたいだけです。
私が考えていたのは、wgetでURLとの接続を開く方法があるはずです-そして、IPを渡すと、接続を再確立する必要がなくなります。
ご協力いただければ幸いです。
解決
サーバーをサポートする同じHTTP / 1.1( Connection:keep-alive
)に属する連続したアドレスで wget
に複数のアドレスを一度に与えると、 wget
は、既に確立された接続を再利用します。
コマンドラインにリストするアドレスが多すぎる場合は、それらをファイルに書き込んで -i
/ -input-file =
オプションを使用できます(そして、UNIXの伝統により、 -i-
/ -input-file =-
は標準入力を読み取ります。)
ただし、異なる wget
呼び出し間で接続を保持する方法はありません。
他のヒント
スレッド化されたRubyスクリプトを記述して、複数の入力ファイルで同時にwgetを実行し、プロセスを高速化することもできます。したがって、10,000個のアドレスをそれぞれ含む5つのファイルがある場合、次のスクリプトを使用できます。
#!/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 }
これらのスレッドはそれぞれ、1つの接続を使用してファイル内のすべてのアドレスをダウンロードします。次のコマンドは、サーバーへの5つの接続のみを意味し、50,000個のファイルをすべてダウンロードします。
./fetch.rb "list1.txt" "list2.txt" "list3.txt" "list4.txt" "list5.txt"
また、ファイルのリストをPOST要求として送信し、サーバーがそれらのデータを含むオブジェクトを返す小さなプログラム(JavaまたはCなど)を作成することもできます。遅すぎてもいけません。