@
geelaw #4 这里应该改成 $b=@{} 然后 gc 需要调优,正确的代码
measure-command {
$sz = gc b -read 16000 | measure | select -expand count
$sz *= 2 * 16000
$b = [System.Collections.Generic.Dictionary[string,string]]::new($sz)
gc b -read 16000 | % { foreach ($x in $_) {
$b[$x.substring(0,$x.indexof(' '))] = $x
} }
gc a -read 16000 | % { foreach ($x in $_) { $b[$_] } } | sc C -encoding utf8
}
需要 2 min 左右。
不过更好的方法是把 a 存进内存,然后 stream 处理 b,如下
measure-command {
$s = [System.Collections.Generic.HashSet[string]]::new([string[]](gc a))
gc b -read 16000 | % { foreach ($x in $_) { if ($s.contains($x.substring(0,$x.indexof(' ')))) { $x } } } | sc C -encoding utf8
}
只要 12.5s 。
@
shuizhongyu10 #9 答案在 #4 第一行