「住所から緯度経度を取得する」の版間の差分

提供: dococo wiki
ナビゲーションに移動 検索に移動
imported>Webmaster
imported>Webmaster
1行目: 1行目:
 +
== 目的 ==
 +
国土交通省の'''[http://nlftp.mlit.go.jp/isj/ 街区レベル位置参照情報]'''とauホームページの「[http://www.au.kddi.com/mobile/area/effective-speed/ 実効速度について]」の情報から、住所をキーとして緯度経度を抽出して、速度の中央値を算したいとおもいます
 +
== 考え方の注意 ==
 +
今回のプログラムは、簡単に説明すれば2つのファイルの共通事項(キー:ここでは測定場所・住所)を比較して、合致(ヒット)したら、出力するという簡単な動作ですが、作り方を失敗すると途方も無い時間がかかるプログラムになります。<br />
 +
今回のサンプルでは
 +
:緯度経度の入っている'''[http://nlftp.mlit.go.jp/isj/ 街区レベル位置参照情報]'''で26万レコード
 +
:auホームページの「[http://www.au.kddi.com/mobile/area/effective-speed/ 実効速度について]の測定ポイントが1500ヶ所
 +
総当たりで、検索をした場合3.9億回ループを回すことになります。全最後までループが回るとは考えられませんが、それでも相当な時間がかかるプログラムになると予想できます<br />
 +
しかし総当たりしないと「ヒット」するか否か分かりません。従って時間短縮のためにどうするかを考えます<br />
 +
== キーのメモリ読み込み ==
 +
ディスクアクセスに相当な時間がかかるので、キーとなる情報をメモリ内に読み込ませてループを回します。そうすることでかなりの時間が短縮されます。<br />
 +
また、応用としてキーとなる情報を事前に出来るだけ減らしてメモリ内に読み込ませれば、さらに時間短縮なります。
 +
== プログラム ==
 +
動作内容を丁寧にコメントアウトしていますので、ソースを見ながら理解してください。
 +
 
<syntaxhighlight lang="perl">
 
<syntaxhighlight lang="perl">
 
     my $file_name = $ARGV[0];
 
     my $file_name = $ARGV[0];

2015年12月29日 (火) 09:37時点における版

目的

国土交通省の街区レベル位置参照情報とauホームページの「実効速度について」の情報から、住所をキーとして緯度経度を抽出して、速度の中央値を算したいとおもいます

考え方の注意

今回のプログラムは、簡単に説明すれば2つのファイルの共通事項(キー:ここでは測定場所・住所)を比較して、合致(ヒット)したら、出力するという簡単な動作ですが、作り方を失敗すると途方も無い時間がかかるプログラムになります。
今回のサンプルでは

緯度経度の入っている街区レベル位置参照情報で26万レコード
auホームページの「実効速度についての測定ポイントが1500ヶ所

総当たりで、検索をした場合3.9億回ループを回すことになります。全最後までループが回るとは考えられませんが、それでも相当な時間がかかるプログラムになると予想できます
しかし総当たりしないと「ヒット」するか否か分かりません。従って時間短縮のためにどうするかを考えます

キーのメモリ読み込み

ディスクアクセスに相当な時間がかかるので、キーとなる情報をメモリ内に読み込ませてループを回します。そうすることでかなりの時間が短縮されます。
また、応用としてキーとなる情報を事前に出来るだけ減らしてメモリ内に読み込ませれば、さらに時間短縮なります。

プログラム

動作内容を丁寧にコメントアウトしていますので、ソースを見ながら理解してください。

    my $file_name = $ARGV[0];
    chomp($file_name);//あああああ
    
    $lines = 0;
    open(FILE, $file_name) or die "Can't open `$filename': $!";
    while (sysread FILE, $buffer, 4096) {
        $lines += ($buffer =~ tr/\n//);
    }
    close FILE;
    print $lines;