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であれば、コンパイルの手間もなくて意外と簡単に使うことができるので。
- BOM付きUTF-8からBOMを除去するpython
- jythonのヒープメモリ設定
- Kotlin 1.2.31がいつの間にかリリースされていた
- Kotlinで$(ドルマーク)を出力する
- KotlinでJAXB
- Kotlinを使ってみた
- Kotlin今日の発見 2018年8月3日
- Kotlin再発見
- macOSをHigh Sierraに更新した。スクリプト実行環境のバージョンは変わったのか
- macOSをMojaveに更新した。スクリプト実行環境のバージョンは変わったか
コメントを残す