ツインテールの吸血鬼はお好きですか

Do you like a twintail vampire ?

Powershell雑感

最近Powershellをちょこちょこ使ったりしている。言語としては大変面白い。現代的な言語らしく、何もかもがオブジェクト扱いってのがいい。コマンドレットの出力がオブジェクトで、それを次のコマンドレットにパイプで渡すってのがすごく洗練されてる気がする。
その反面、Powershellは高度なオブジェクト化の実現のためにだいぶプロセッサとメモリを使いすぎてるようにも思う。メモリをバカ食いするし、処理が重い。
おれの使い方が悪いのかもしれないが、Powershellは何百万行あるテキストファイルの整形とかはすごく苦手だ。元よりシステム運用のための言語であって、バッチ処理をガリガリ行うようには作られていないのだろう。

たとえば、Perlだと何百、何千万行あるテキストでも次の構文でそつなく処理できる。

open FH , "test.txt"
while($line = <FH>){

}

一行ずつレコード読んでいくってのが効くんだよね。

Powershellだと、次みたいな感じになるのかなぁ…。

foreach($line in Get-Content "test.txt"){

}

だけど、この場合Get-Contentは「test.txtのすべての行をいったん読み込みそれを配列のStringsオブジェクト化して、その後一配列ずつ$lineに入れていく」みたいな処理をする。そのため、ギガバイト単位のテキストとか読ませるとその時点でだいたいフリーズする。オブジェクト化すると生のデータの何倍ものデータ量になってしまうみたいだし。
もちろん一行ずつ読んでいく方法もあるんだけど、個人的にはそれでもやっぱり遅いなぁって思う。


最近テキスト処理のバッチをPowershellで書いてたんだけど、あまりに遅すぎたのでPerlで書きなおしたら100倍くらい早くなったよ…。おれのPowershellの使い方が悪すぎるのかもしれない。