Last-Modified: Wednesday, 24 July 2002 22:19:57 +0900 (JST)

24 July of 2002



・ちょっと気になったので...
気になるので スプリクトを見てみる
perl の場合はコマンド結果の出力($TelSock->cmd("show ipv6 bgp"))を 連想配列に突っ込んでいるのでメモリ食いまくりで BGP の IPv4 フルルートを取得する のが多分無理だと思うんですな。
この部分のコードって... my @line = $TelSock->cmd("show ipv6 bgp"); という行ですね。 これ、連想配列ではないです。普通の配列ですね。 (しかもPerl5からは、 連想配列でなくハッシュと呼んでいますね。)
たしかに、このようなコードでは、モジュールが実行された結果が @line という配列にコピー しているのでメモリを無駄に消費していると言えるでしょう。
そこで、その無駄な消費を防ぐには、モジュールから戻り値をそのまま foreachループの要素に してしまうことです。結果の出力部分の改造が必要ですが....
foreach( $TelSock->cmd('show ipv6 bgp')) {
	print ($List_mode eq 'EDIT' ) ? cooked($_) : $_;
}
$TelSock->close;
exit;

sub cooked {  # 書式化するためのサブルーチン
	my $prm = shift;

	   :	# この間で適当に、出力形式を編集する...

	$prm;
}
		
とすれば、配列 @line が不要になり、メモリの節約になります。でもモジュールは、 その戻り値を保持するために、メモリを消費するので、その点は注意。 なお、BGPのフルルートを処理できるか、どうかという問題はスプリクトの書き方にもよるし、 実行する環境に実装されているメモリの量(スワップを含む)に依存します。 Perl だと 無理だと判断するのは、間違っていると思います。
なお、Perlは使えるだけメモリを取って、配列などの変数に割り当てます。

あと、下記のコードですが...
if ($In  eq "") {
    ($Host,$Port) = split(":",$In);
} elsif ($In eq "-h" || $In eq "--help") {
    print "zeb_full_get.pl [hostname:port] [password]\n\n";
    exit 1;
} else {
}
$In が "" と等しいとき(eq) に ($Host,$Port) = split(":",$In); を実行 していますが、 $In が '' なので $Host, $Port ともに undef が入るはずですが...
# それから実行するブロックがないときは else{} を略して大丈夫なはず。
実行したスプリクトの名前は $0 で取れます。スプリクト名が変わったときにも対応できますよ。 あと、変数展開しない文字列は " でなく ' で囲んだ方がいいと思います。

・Net::Telnet
私は、このモジュールを使ったことがないし、その実装を調べていないので、なんとも言えませんが、 実行結果をまとめてメモリに保持するのでなく、1行処理したら、次の1行をソケットから読み込み、 なくなるまで繰り返すような実装にすれば、多少行数が多いデータがあっても、あまりメモリを必要と せずに 処理可能だと思います。この場合、処理しながら読むので、一気にメモリに読み込む場合に 比べ、ソケットがオープンされている時間が長くなる、という欠点がありますね。
まぁ フルルートの情報を読んで表示できるかどうか、それはスプリクトの実装依存ということで...

・script
# まぁ、まだまだ改良ポイント いっぱい... という感じですか...

・DVカメラ
某ショップにて DVカメラの値段調査。三脚に載せた状態で、テープ交換できる条件で探す。
うーん Panasonic か Victor製だなぁ...
あとCCDの解像度がちょっと気になる。デジタルズームが必要になったときに、画質に大きく影響 してくるから、100万画素前後あった方がいいかも。でも撮影対象は、画質をあまり気にしない もののはず。
しかし、MPEG2→MPEG4と二段階変換がかかりそうなので、やはりオリジナルは綺麗な 方が.... と思ってしまう。

・TOPIX
16ポイント以上の反落して976ポイント台。出来高は7億7000万あまり。日経平均株価も 10,000円台を 割り込んだ様子。