GAE/Pの開発環境のDatastoreをSQLiteに変えた場合のパフォーマンス

Google App Engineのドキュメントによると開発環境では、起動時のオプションに「--use_sqlite」を付けることにより、datastoreをSQLiteに変更することができるみたいです。その場合は、データが大量にある場合に、パフォーマンスがよくなるとのことなので試してみました。なお、テストはそれぞれの件数(100, 1000, 10000)に対して「Create: put(新規作成)」、「Get: get_by_key_name」、「Update: put(更新)」、「Filter: filter」、「Delete: delete」を実行しました。

例) --use_sqliteのテスト

normal – 100
  Create: 0.252383947372[s]
  Get: 0.183959007263[s]
  Update: 0.383213043213[s]
  Filter: 0.151600122452[s]
  Delete: 0.201349020004[s]
sqlite – 100
  Create: 0.672926187515[s]
  Get: 0.148027896881[s]
  Update: 0.862988948822[s]
  Filter: 0.0666959285736[s]
  Delete: 0.565711021423[s]
normal – 1000
  Create: 3.53182291985[s]
  Get: 1.23170685768[s]
  Update: 5.67884898186[s]
  Filter: 1.19097089767[s]
  Delete: 3.1386449337[s]
sqlite – 1000
  Create: 7.13252592087[s]
  Get: 1.46165585518[s]
  Update: 10.1127738953[s]
  Filter: 0.395759105682[s]
  Delete: 6.8081278801[s]
normal – 10000
  Create: 136.031145096[s]
  Get: 12.1488070488[s]
  Update: 259.642371893[s]
  Filter: 12.5899090767[s]
  Delete: 136.140117884[s]
sqlite – 10000
  Create: 102.926085949[s]
  Get: 14.5877349377[s]
  Update: 141.128255129[s]
  Filter: 3.9145219326[s]
  Delete: 132.707653999[s]

この結果を見る限り、件数が10000件とかになると確かにパフォーマンスがよくなっています。なお、テストに使ったコードは以下の通りです。

class SqliteTest(db.Model):
    val = db.IntegerProperty()
    alpha = db.StringProperty()
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)


class MainHandler(webapp.RequestHandler):

   def get(self):
        loop_num = 100
        alpha_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        alpha_list = []
        for i, _alpha in enumerate(alpha_str):
            if i % 3 == 0:
                alpha_list.append(_alpha)
        len_alpha = len(alpha_str)
        stime = time.time()
        for i in xrange(loop_num):
            pos = i % len_alpha
            sqliteTest = SqliteTest(key_name=str(i),val=i,
                    alpha=alpha_str[pos: pos+1])
            sqliteTest.put()
        logging.info("Create: " + str((time.time() – stime)) + "[s]")
        stime = time.time()
        for i in xrange(loop_num):
            sqliteTest = SqliteTest.get_by_key_name(str(i))
        logging.info("Get: " + str((time.time() – stime)) + "[s]")
        stime = time.time()
        for i in xrange(loop_num):
            sqliteTest = SqliteTest.get_by_key_name(str(i))
            sqliteTest.val = loop_num – i
            sqliteTest.put()
        logging.info("Update: " + str((time.time() – stime)) + "[s]")
        stime = time.time()
        for sqlite_test in SqliteTest.all().filter(
                "alpha in", alpha_list).order("-alpha"):
            pass
        logging.info("Filtere: " + str((time.time() – stime)) + "[s]")
        stime = time.time()
        map(lambda s: s.delete(), SqliteTest.all())
        logging.info("Dalete: " + str((time.time() – stime)) + "[s]")

この記事が役に立った場合、シェアしていただけると励みになります!!