- ・ちょっと気になったので...
- 気になるので スプリクトを見てみる
perl の場合はコマンド結果の出力($TelSock->cmd("show ipv6 bgp"))を 連想配列に突っ込んでいるのでメモリ食いまくりで BGP の IPv4 フルルートを取得する のが多分無理だと思うんですな。この部分のコードって... my @line = $TelSock->cmd("show ipv6 bgp"); という行ですね。 これ、連想配列ではないです。普通の配列ですね。 (しかもPerl5からは、 連想配列でなくハッシュと呼んでいますね。)
たしかに、このようなコードでは、モジュールが実行された結果が @line という配列にコピー しているのでメモリを無駄に消費していると言えるでしょう。
そこで、その無駄な消費を防ぐには、モジュールから戻り値をそのまま foreachループの要素に してしまうことです。結果の出力部分の改造が必要ですが....
とすれば、配列 @line が不要になり、メモリの節約になります。でもモジュールは、 その戻り値を保持するために、メモリを消費するので、その点は注意。 なお、BGPのフルルートを処理できるか、どうかという問題はスプリクトの書き方にもよるし、 実行する環境に実装されているメモリの量(スワップを含む)に依存します。 Perl だと 無理だと判断するのは、間違っていると思います。foreach( $TelSock->cmd('show ipv6 bgp')) { print ($List_mode eq 'EDIT' ) ? cooked($_) : $_; } $TelSock->close; exit; sub cooked { # 書式化するためのサブルーチン my $prm = shift; : # この間で適当に、出力形式を編集する... $prm; }
なお、Perlは使えるだけメモリを取って、配列などの変数に割り当てます。
あと、下記のコードですが...
$In が "" と等しいとき(eq) に ($Host,$Port) = split(":",$In); を実行 していますが、 $In が '' なので $Host, $Port ともに undef が入るはずですが...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 { }
# それから実行するブロックがないときは else{} を略して大丈夫なはず。
実行したスプリクトの名前は $0 で取れます。スプリクト名が変わったときにも対応できますよ。 あと、変数展開しない文字列は " でなく ' で囲んだ方がいいと思います。- ・Net::Telnet
- 私は、このモジュールを使ったことがないし、その実装を調べていないので、なんとも言えませんが、 実行結果をまとめてメモリに保持するのでなく、1行処理したら、次の1行をソケットから読み込み、 なくなるまで繰り返すような実装にすれば、多少行数が多いデータがあっても、あまりメモリを必要と せずに 処理可能だと思います。この場合、処理しながら読むので、一気にメモリに読み込む場合に 比べ、ソケットがオープンされている時間が長くなる、という欠点がありますね。
まぁ フルルートの情報を読んで表示できるかどうか、それはスプリクトの実装依存ということで...- ・script
- # まぁ、まだまだ改良ポイント いっぱい... という感じですか...
- ・DVカメラ
- 某ショップにて DVカメラの値段調査。三脚に載せた状態で、テープ交換できる条件で探す。
うーん Panasonic か Victor製だなぁ...
あとCCDの解像度がちょっと気になる。デジタルズームが必要になったときに、画質に大きく影響 してくるから、100万画素前後あった方がいいかも。でも撮影対象は、画質をあまり気にしない もののはず。
しかし、MPEG2→MPEG4と二段階変換がかかりそうなので、やはりオリジナルは綺麗な 方が.... と思ってしまう。- ・TOPIX
- 16ポイント以上の反落して976ポイント台。出来高は7億7000万あまり。日経平均株価も 10,000円台を 割り込んだ様子。