目前在做一些數(shù)據(jù)處理的任務(wù)观腊,需求是對給出的日期范圍處理對應(yīng)日期的數(shù)據(jù)文件后顯示在dashboard上借杰,如果該日的數(shù)據(jù)文件已經(jīng)處理過,則存儲成另外的數(shù)據(jù)文件蝇恶,下次有該日期的時候則直接讀取另外的數(shù)據(jù)文件撵儿。對于有當(dāng)日日期的數(shù)據(jù)做特殊處理乘客,即只處理不存儲成另外的數(shù)據(jù)文件,因為本日的數(shù)據(jù)有可能繼續(xù)增加淀歇,存儲沒有意義易核。
?其中對于每日的未處理數(shù)據(jù),是多條json數(shù)據(jù)組成浪默,大小較大牡直,處理完后是單一json數(shù)據(jù)缀匕,數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,值為列表和字符串碰逸,列表里有字典類型數(shù)據(jù)乡小。對于給定的日期范圍,最后需要統(tǒng)計json值的"和"饵史。
以下是我對計算給定日期范圍的數(shù)據(jù)值和的思路:
1.遍歷時間讀取對應(yīng)時間文件進行數(shù)據(jù)處理劲件,得到每天一個json值
2.考慮到如果頻繁請求一個區(qū)間的和,那么按照以往做acm的經(jīng)驗约急,必然是前綴和無疑了,即預(yù)處理前綴和苗分,那么區(qū)間[a,b]的值即為sum[b] - sum[a-1]
3.這方式起初看可行厌蔽,實際中考慮到的問題有幾點:前綴和有個起始點,這個起始點當(dāng)然可以是任意摔癣,但是不容易記憶(即使不記憶也沒有太大問題)奴饮;當(dāng)請求的天數(shù)越過了中間未處理的日期,前綴和會失敗(當(dāng)然存在解決辦法是跑定時任務(wù)去處理每天的數(shù)據(jù))择浊;對于json數(shù)據(jù)戴卜,'減'的定義不是很明確,當(dāng)然不存在會減去不存在的值
4.在通過實踐后發(fā)現(xiàn)讀取文件處理數(shù)據(jù)數(shù)據(jù)速度非匙裂遥快投剥,每次求和也不會造成很長時間消耗(都在1s內(nèi)出結(jié)果,數(shù)據(jù)還沒有大到不可接受)
5.最后的解決方案是每日數(shù)據(jù)處理后生成數(shù)據(jù)文件担孔,請求時做求和并緩存江锨,對于當(dāng)前數(shù)據(jù)量而言,效率還可以