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があれば製品コードでも検討してもいいと思う。

*1:ただし、このバインディングは複数のDBインスタンスを想定していないなどクオリティが低いので、製品コードで使えるレベルではない