Android的には、LevelDBはSharedPreferencesの高速な代替として使えそう
AndroidにおけるLevelDB bindingは複数あるようだけど、今回はMaven Centralに上がっていてかつ読み書きAPIがわかりやすい以下のものを使った*1。
dependencies {
compile 'im.amomo.leveldb:leveldb:1.0.+@aar'
}
KVSなのでSharedPreferencesのように使える。速度はopen/closeにSharedPreferencesよりコストが掛かるものの、読み書きは非常に高速にできるようだ。
サンプルアプリのソースコード:
使っているところはこんな感じ:
private void performLevelDB(int n) { long t0 = System.currentTimeMillis(); LevelDB db = DBFactory.open(this); for (int i = 0; i < n; i++) { if (db.exists("foo")) { long value = db.getLong("foo"); db.put("foo", value + 1L); } else { db.put("foo", 1L); } } db.close(); textView.append("LebelDB open, (get, put)*" + n + ", and close: " + (System.currentTimeMillis() - t0) + "ms\n"); }
その他のLevelDB bindingとしては以下のものがある。IteratorやWriteBatchなどひと通り実装済みだが、get/putが byte[] でしかできず、Javaで使うのはかなり大変そうだ。高速なのは確かなので、まともなbindingがあれば製品コードでも検討してもいいと思う。