これ見てたらついムラムラと。
初出2010.08.11; 08.12 追記
time perl mirrorget.pl cpan.yml http://www.cpan.org/src/perl-5.12.1.tar.bz2
# Stage 0: checking headers Elapsed: 0.358819961547852 sec. Last-Modified: Sun, 16 May 2010 22:40:16 GMT Content-Length: 12296076 URLs: http://ftp.ring.gr.jp/pub/lang/perl/CPAN/src/perl-5.12.1.tar.bz2 http://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/src/perl-5.12.1.tar.bz2 http://ftp.kddilabs.jp/CPAN/src/perl-5.12.1.tar.bz2 http://ftp.nara.wide.ad.jp/pub/CPAN/src/perl-5.12.1.tar.bz2 http://ftp.dti.ad.jp/pub/lang/CPAN/src/perl-5.12.1.tar.bz2 http://ftp.jaist.ac.jp/pub/CPAN/src/perl-5.12.1.tar.bz2 http://www.cpan.org/src/perl-5.12.1.tar.bz2 http://ftp.riken.jp/lang/CPAN/src/perl-5.12.1.tar.bz2 # Stage 1: fetching by pieces Elapsed: 3.81961703300476 sec. 2 http://ftp.ring.gr.jp/pub/lang/perl/CPAN/src/perl-5.12.1.tar.bz2 1 http://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/src/perl-5.12.1.tar.bz2 2 http://ftp.kddilabs.jp/CPAN/src/perl-5.12.1.tar.bz2 2 http://ftp.nara.wide.ad.jp/pub/CPAN/src/perl-5.12.1.tar.bz2 1 http://ftp.dti.ad.jp/pub/lang/CPAN/src/perl-5.12.1.tar.bz2 2 http://ftp.jaist.ac.jp/pub/CPAN/src/perl-5.12.1.tar.bz2 1 http://www.cpan.org/src/perl-5.12.1.tar.bz2 1 http://ftp.riken.jp/lang/CPAN/src/perl-5.12.1.tar.bz2 # Final Stage: gathering pieces Elapsed: 0.177625894546509 sec. 0.346u 0.304s 0:04.43 14.4% 0+0k 1023+13io 0pf+0wtime perl mirrorget.pl freebsd.yml http://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img
# Stage 0: checking headers Elapsed: 0.844078063964844 sec. Last-Modified: Mon, 19 Jul 2010 03:24:04 GMT Content-Length: 948244480 URLs: http://ftp.jaist.ac.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img http://ftp.iij.ad.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img http://ftp.sakura.ad.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img http://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img http://ftp.riken.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img # Stage 1: fetching by pieces Elapsed: 92.5969209671021 sec. 192 http://ftp.jaist.ac.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img 350 http://ftp.iij.ad.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img 183 http://ftp.sakura.ad.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img 18 http://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img 162 http://ftp.riken.jp/pub/FreeBSD/ISO-IMAGES-i386/8.1/FreeBSD-8.1-RELEASE-i386-memstick.img # Final Stage: gathering pieces Elapsed: 14.6915600299835 sec. 20.043u 20.714s 1:48.21 37.6% 0+0k 1512+449io 0pf+0wtime perl mirrorget.pl ubuntu.yml http://releases.ubuntu.com/10.04/ubuntu-10.04-desktop-i386.iso
# Stage 0: checking headers Elapsed: 0.744369983673096 sec. Last-Modified: Thu, 29 Apr 2010 12:56:31 GMT Content-Length: 733419520 URLs: http://ftp.riken.jp/Linux/ubuntu-iso/CDs/10.04/ubuntu-10.04-desktop-i386.iso http://ubuntu.mithril-linux.org/releases/10.04/ubuntu-10.04-desktop-i386.iso http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/releases/10.04/ubuntu-10.04-desktop-i386.iso http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/10.04/ubuntu-10.04-desktop-i386.iso http://releases.ubuntu.com/10.04/ubuntu-10.04-desktop-i386.iso http://www.ftp.ne.jp/Linux/packages/ubuntu/releases-cd/10.04/ubuntu-10.04-desktop-i386.iso http://ubuntutym2.u-toyama.ac.jp/ubuntu/10.04/ubuntu-10.04-desktop-i386.iso # Stage 1: fetching by pieces Elapsed: 75.2669811248779 sec. 161 http://ftp.riken.jp/Linux/ubuntu-iso/CDs/10.04/ubuntu-10.04-desktop-i386.iso 157 http://ubuntu.mithril-linux.org/releases/10.04/ubuntu-10.04-desktop-i386.iso 32 http://ftp.yz.yamagata-u.ac.jp/pub/linux/ubuntu/releases/10.04/ubuntu-10.04-desktop-i386.iso 153 http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/10.04/ubuntu-10.04-desktop-i386.iso 5 http://releases.ubuntu.com/10.04/ubuntu-10.04-desktop-i386.iso 185 http://www.ftp.ne.jp/Linux/packages/ubuntu/releases-cd/10.04/ubuntu-10.04-desktop-i386.iso 7 http://ubuntutym2.u-toyama.ac.jp/ubuntu/10.04/ubuntu-10.04-desktop-i386.iso # Final Stage: gathering pieces Elapsed: 9.25442099571228 sec. 15.819u 16.198s 1:25.38 37.4% 0+0k 99+143io 0pf+0w
たとえばCPANから超速でダウンロードしたかったら、
master: http://www.cpan.org/ mirrors: - http://ftp.kddilabs.jp/CPAN/ - http://ftp.nara.wide.ad.jp/pub/CPAN/ - http://ftp.jaist.ac.jp/pub/CPAN/ - http://ftp.dti.ad.jp/pub/lang/CPAN/ - http://ftp.ring.gr.jp/pub/lang/perl/CPAN/ - http://ftp.riken.jp/lang/CPAN/ - http://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/
という内容のYAMLファイルを用意しておき、このファイルとMaster Site上のURLを引数で指定すると、mirror sitesも含めたサイトから、1MBづつファイルを分割ダウンロードした後結合するわけです。
我が家はマンション一棟GbE、各住戸100Mbpsという接続環境なのですが、見てのとおり、回線は真っ黒怪になります。librahackに使ったらおまわりさんがソッコーでピンポンきそう。
ダウンロード終了後は各URLから何チャンクダウンロードしたかが表示されます。ネットワーク的に遠いサーバーは遅い分それだけ少ないことがきちんと見て取れます。
回線品質が格段に上がった昨今では、「たかがスマートフォン」が何百MBものアップデートファイルをCDNを通してダウンロードしたりもします、そんな中にあって分散ダウンロードは周回遅れの技術に見えはしますが、こうしてこさえてみるとなかなかどうして使い出がありそうです。たかだか120行のプログラムでここまでできるとは。
Enjoy!
Dan the Just Another AnyEvent Newbie
追記:2010.08.12 v0.02
- きちんとmirrorするようにしました。すなわちローカルにファイルがあればそれをチェックし、セーヴするときにはタイムスタンプも同期します。
openのモードを:rawにしました。コメント欄参照- Strawberry Perlでも動作確認
追記:2011.01.09 v0.03
- s/mirror/mirrors/g
- s/YAML::Syck/YAML/g
- Code Embed by gist
改めて見てみたら CPAN からダウンロードした perl-5.12.1.tar.bz2 も破損していました。
そこで3ヶ所の open の第2引数に :raw を追加したところ解決しましたので、ご報告いたします。