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

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

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

ツールの仕様

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

Pythonでならこう作る

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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で作ると

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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