Google App Engine用に作ったDatastoreMapを高速化する

以前に、Google App Engine for Java(以下GAE/J)のデータストアにHashMapのような感覚で書き込む(または読み込む)ためのDatastoreMapというクラスを作成しましたが、より現実的な利用を考えて高速化を行いました。

java.util.Mapのメソッドを仕様に忠実に実装すると、putやremoveの際に置換・削除前の古いデータを返さなければなりませんこれらの戻り値はほとんどのケースで利用されることがないと思うのですが、そのためだけにトランザクションを使用して古いデータを取得し、それから値を置換・削除するというのは、パフォーマンス上のデメリットが大きすぎます。戻り値が使用されないという前提に立てば、トランザクションの使用と古いデータの取得を省略できます。同様のことは(これも以前に作成した)MemcacheMapにも言えます。

今回は、上記のようにputとremoveの戻り値の取得を省略することで、処理を高速化したFastDatastoreMap、FastMemcacheMap、また、データストア操作時に透過的にキャッシュを行うFastCachedDatastoreMapの実装を行いました。これで、Low-Level APIを叩いたのと同程度の速さで読み書きが行えるはずです。

サンプルコード

使い方はDatastoreMap等とまったく同じです。クラス名にFastがついただけです。

// 「名前」に対応した「年齢」を格納する"people"というkindのMapオブジェクトを生成。
Map<String, Integer> map = new FastDatastoreMap<String, Integer>("people");

// Mapにデータ(「名前」と「年齢」)を格納。
map.put("Tom", 27);
map.put("Mary", 21);
map.put("John", 23);

// 「年齢」を取得。
int ageOfMary = map.get("Mary");

// 「名前」が”Tom"のデータを削除。
map.remove("Tom");

ダウンロードと使い方

JARファイルとソースを下記からダウンロードできます。Apache License 2.0にて公開します。

GitHub - koher/Koherent-App-Engine-Library-for-Java: Koherent App Engine Library is a library for Google App Engine for Java. It includes "DatastoreMap" which enable to operate Datastores like java.util.HashMap, "DatastoreOutputStream" which enable to write data to Datastores like java.util.FileOutputStream and so on.
(画面右上あたりのDownload Sourcesをクリック→ZipかTarの形式を選択)

ダウンロードした圧縮ファイルを解凍し、中にあるJARファイルを/WEB-INF/libに放り込んでパスを通せばOKです(Eclipseなら、プロジェクトを右クリック→Properties→Java Build Path→Libraries→Add JARs→/WEB/INF/libの中に入れたJARファイルを選択)。

その他

配布ファイル内には、データストアにFileInputStream/FileOutputStreamのように書き込みを行うためのクラス、DatastoreInputStream/DatastoreOutputStreamも含んでいます。また、実はFileReader/FileWriterに対応するDatastoreReader/DatastoreWriterもこっそりと実装していてそれらも含んでいます。