When it’s ready.

出来るまで出来ない

CSVファイルとSQLite、どっちの方が速い? Djangoの話

そろそろDjango飽きてきた。

CSVファイルをJSONで配るだけの簡単なDjangoアプリ作ってます。
ある程度出来たんだけど、実際に動かすとサクサクしてないので、DB使えば速くなるんじゃないかと素人考えで、SQLite使って実装しました。

CSVバージョン

ファイル開いて、スプリットしてList詰め直してjsonにするだけ

from django.utils import simplejson as json

file = open(makeFilePath(DATA_PATH, file_name), 'r')
res = file.readlines()
resArr = []
for i in res:
  x = i.split(',')
  resArr.append([str(x[0]),str(x[1]),str(x[2]),str(x[3]),str(x[4][:-1])])
json.dumps(arrArr, indent=2, ensure_ascii=False)  

SQLiteバージョン

CsvDataというモデルを作成。CSVデータを1行を1エントリにして登録したデータをシリアライザー使ってJSONで吐き出す。

from django.core import serializers
data = serializers.serialize("json", CsvData.objects.all(),
      ensure_ascii=False,)

結果

Requests per second: 63.59 [#/sec] (mean)
Time per request: 15.725 [ms] (mean)

Requests per second: 8.82 [#/sec] (mean)
Time per request: 113.354 [ms] (mean)

残念過ぎる結果になりました。思わず叫んでしまった。
モデルに登録する部分とか、テストコードとか意外と書いたのに!smb経由でsqlite使えなくてネットさ迷った結果がこれかよ!と、悲しい気持ちになりました。

悪あがき

あまりにも悲しかったので、memcache使ってみました。
ubuntu9.04使ってたのでさくっとmemcachedとpython-memcache入れました。apt-get最高ですね。

settings.pyに一行追加

CACHE_BACKEND = 'memcached://127.0.0.1:11211'

memcachedを起動させる

memcached -m 64 -p 11211

views.pyをちょこっと修正

from django.core.cache import cache
def result_test(request):
  if cache.get('hoge_json'):
    return HttpResponse(cache.get('hoge_json'))
  else:
    res = makeJsonFromDB()
    return HttpResponse(res)

DBからjson作った後に一行追加

cache.set('hoge_json', res, 10)

コマンド2つと5行追加しただけで、memcache使えるなんてDjangoはとても便利ですね。

memcacheの結果

Requests per second: 277.98 [#/sec] (mean)
Time per request: 3.597 [ms] (mean)

SQLiteの時より32倍速くなってる
CSVの時より4.4倍速くなってる

もっと速くなるかと思ったけど、30倍速くなったのでそこそこ満足。

SQLite : CSV = 64 : 9

一方通行のデータだったら今後は迷わずCSVから読見込んだ方がいいみたい。もっと頑張れよSQLite

memcacheは、今まで共有ストレージ的にしか使ったことがなかったけどDjangoからこんなに簡単に使えるんだったらもっと早く使っておけばよかった・・・orz