星期二, 8月 24, 2010

一定要自己踢過一次鐵板才能學會 (一)

在公司的一個appengine程式, 終於蒐集了一小筆資料(不到一千筆), 現在想對這些資料做些統計, 再用Google Chart API顯示出來. 可以預期等到這個程式正式上線, 資料是幾十幾百萬來計算的時候, 這個統計方法一定會有問題, 不過我還沒什麼想法, 現在一開始是這麼做的.


第一個練習的版本, 實在是非常直覺. 就是指定兩個URL, 一個做統計, 並且把統計結果放到memcache裡. 另外一個把memcache裡的結果讀出來, 做成Google Chart API的URL格式, 再顯示出來.

def func1(self):
    result = {}
    query = Report.all()
    for report in query:
        if report.name in result:
            result[report.name] += 1
        else:
            result[report.name] = 1
    memcache.add('statsReport', result, 3600)

def func2(self):
    result = memcache.get('statsReport')
    if result is None:
        return
    sorted = result.keys()
    sorted.sort()
    qty = ''
    name = ''
    for i in range(len(sorted)):
        qty += str(result[sorted[i]]) + ','
        name += sorted[i] + '|'
    qty = qty[0:-1]
    name = name[0:-1]
    url = 'http://chart.apis.google.com/chart?chs=400x225&cht=p&chd=t:%s&chl=%s&chtt=Report' % (qty, name)
    # output url

這個版本在一千筆資料左右的時候還可以動, 不過已經要花八到十秒, 很快就會到timeout的門檻. 它才做了其中一個統計數據, 而我一開始就想對Report裡的欄位做10個不同的統計. 想當然爾, 就先擴充func1(), 大致上就是在for loop裡做了十次類似的判斷, 然後再分別塞到memcache裡.

結果在執行的時候, 果不其然馬上就超過了30秒的timeout限制. 看看接下來要用什麼方法來optimize吧.

沒有留言: