Kotlin1.2.50がリリースされていた

Kotlin1.2.50がリリースされていた

1.2.50になったからと言って何が新しくなったのかわからないが、
せっかくリリースされたので、今日のツールはKotlinで作る。
いつもなら、チョチョイとpython3を使うところだが。

ツールの仕様

日々の積み重ねで480万レコードになってしまったダンプファイルがある。
そのファイルはタブで区切られていて、特定のカラムの中の文字列の最大長が何文字か調べたい。

Pythonでならこう作る


import codecs

with codecs.open('out1.txt', 'w', 'utf-8') as w1:
with codecs.open('out2.txt', 'w', 'utf-8') as w2:
with codecs.open('in.txt', 'r', 'utf-8') as r:
for line in r:
arr = line.strip().split('\t')
if len(arr) >= 4:
c0, c1, c2, c3 = arr[0:4]
if len(c2) > 10:
w1.write('{:03d}\t{}\t{}\n'.format(len(c2), c0, c2))
if len(c3) > 10:
w2.write('{:03d}\t{}\t{}\n'.format(len(c3), c0, c2))
else:
print('?[{}][{}]'.format(len(arr), line.strip()))

なかなか簡潔に書ける。
withの入れ子が深いけど、これくらいの長さなら気にしない。
適当なサーバで実行したら、480万レコードのファイルを調査するのに50秒かかった。

Kotlinで作ると


import java.io.File

File("out1.txt").bufferedWriter().use { w1 ->
File("out2.txt").bufferedWriter().use { w2 ->
File("in.txt").forEachLine {
val arr = it.split('\t')
if (arr.size >= 4) {
val (c0, c1, c2, c3) = it.split("\t")
if (c2.length > 10) {
w1.write("%03d\t%s\t%s\n".format(c2.length, c0, c2))
}
if (c3.length > 10) {
w2.write("%03d\t%s\t%s\n".format(c3.length, c0, c3))
}
} else {
println("?[%d][%s]".format(arr.size, it))
}
}
}
}

閉じカッコの分、Kotlinの方が長くなってしまうが、pythonと同様に簡潔に書ける。
pythonのときと同じサーバで実行したら、同じ480万レコードのファイルを調査するのに3秒かかった。
Kotlin(java vm?)速い。

まとめ

最近、またpythonでツールを作ることが多くなっていたが、
Kotlinでの実装もなかなか楽しい。

処理速度がとても速い事にも驚いた。pythonに高速な印象はなかったが
ツールだったので、あまり遅さを気にしていなかった。
しかし、Kotlinがここまで速いのであれば、データ量に応じて率先してKotlinを使ってもいいのかもしれない。
.ktsであれば、コンパイルの手間もなくて意外と簡単に使うことができるので。

同じタグの記事
同じカテゴリの記事

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA