一定要自己踢過一次鐵板才能學會 (一)
在公司的一個appengine程式, 終於蒐集了一小筆資料(不到一千筆), 現在想對這些資料做些統計, 再用Google Chart API顯示出來. 可以預期等到這個程式正式上線, 資料是幾十幾百萬來計算的時候, 這個統計方法一定會有問題, 不過我還沒什麼想法, 現在一開始是這麼做的.
第一個練習的版本, 實在是非常直覺. 就是指定兩個URL, 一個做統計, 並且把統計結果放到memcache裡. 另外一個把memcache裡的結果讀出來, 做成Google Chart API的URL格式, 再顯示出來.
這個版本在一千筆資料左右的時候還可以動, 不過已經要花八到十秒, 很快就會到timeout的門檻. 它才做了其中一個統計數據, 而我一開始就想對Report裡的欄位做10個不同的統計. 想當然爾, 就先擴充func1(), 大致上就是在for loop裡做了十次類似的判斷, 然後再分別塞到memcache裡.
結果在執行的時候, 果不其然馬上就超過了30秒的timeout限制. 看看接下來要用什麼方法來optimize吧.
第一個練習的版本, 實在是非常直覺. 就是指定兩個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吧.
留言