by:陳澤榮 (timothychenpc@gmail.com)
日期:0126~0127
改動:
一、完善搜索:
這次我把上次的搜索完善了(然後發現內建的搜索好像不行),針對今天的提醒和今天要更換的做了分類處理。然後也調整了一下整個的介面
二、針對搜索功能的壓力測試:
整個搜索功能的流程主要分為兩個部分:
- 生成測試資料,送入資料庫
- 取出資料,進行搜索
然後第一部分是寫了一個腳本
db_test.py
,自動依照客戶資料的格式生成資料,並且每一個資料都帶有兩個部件A和B,然後對應的日期部分代表下一次的更換日期(這部分跟之前有點不一樣),然後我分別用random.choices
在n個測試資料中選擇了5個(當日提醒和當日代辦),並且當成正確解答,輸出檔案,其他的就直接用一個固定的日期(4/27
)填補,以確保不會因為太多,而導致最後難以比對(不要問我怎麼知道的)然後實際測試(4000)
可以看到這部分真的花了很久,但是我其實對這個結果有所預期,因為在這個腳本中我採用的方法是
.insert_one()
也就是說每一次的數據庫操作只完成了一筆資料的新增,也就造成了花費如此時間的囧境(因為每一次的數據庫操作都需要一定的時間),但我其實也不是沒有想過先在本地產生所有的資料,然後使用.insert_many()
方法一次性地送入數據庫,一定可以很大程度的減少花費的時間,但是呢直接報錯裝了4000筆數據的數據庫顯示資料看起來就是
pymongo
在寫入到數據庫的時候發生錯誤,具體的錯誤看起來好像好似跟_id
有關(就是NoSQL
數據庫用於鎖定每一個文件的方式,通常會是ObjectId
的物件,但是也可以指定為其他的型別),然後能我檢查了我提供的_id
也沒有出現重複的情況,後來試了很多(甚至不提供_id
和使用objectid
格式的也都不行),也查了很多,但還是一直報錯,所以只能先用.insert_one()
將就了(如果有人知道是為什麼也可以告訴我)然後因為少兩行,導致所有的資料都被處理成目標,然後就在終端機產生了由8000個結果(因為4000筆每一筆都有兩個部件)構成的雪花屏
總體來說,檔案大小還可以接受(畢竟是純文字儲存的方式,如果換成excel可能都好幾個mb了),
然後會想用4000筆資料來測是因為比較接近廠商的資料。
然後通過line訊息觸發event,得到回覆,實際的耗時大概就是0.21秒(也有0.19的)
這個結果我其實覺得還可以,應付這次的絕對夠,但是還是想之後看看能不能優化一下(但其實在python下身為
tle
戰士的我,覺得可能也提升不了多少。或許是我菜)繼續測試(8000)
*不用擔心隨著範圍改變我們的解答也會重新生成(隨機分佈在8000筆資料中)
後來覺得好像對這個數據不太滿意,想看看它的極限在哪裡,然後又測了8000筆資料的
再測試(40000)
雖然跟8000相比資料量成長為5倍,但實際耗時也只成長為2倍(這我還是蠻困惑的,但是可能跟電腦當下的心情和狀態也會有關啦,而且因為數字蠻小的,所以有時候波動就特別明顯,可以到0.2左右)
三、專案結構的一點改動:
主要是我把我常用的debug的一些腳本做了一個簡單的封裝(一方面是考慮到路徑問題,另一方面是為了好整理),然後就簡單整理成這樣。但是主程式目前還是一個小亂的狀態(之後應該也會針對不同功能分出來,個別進行封裝)
四、修改json格式化輸出的程式
因為之前寫的有一個小bug,就是如果是將程式中的陣列直接轉成
json
字串,然後給程式進行處理,這樣的話一般程式中的陣列在“,”逗號後面都會有一個空格,也就會導致格式化輸出的json
在有些情況都會多一個空格(強迫症表示很難受)後來就是先針對每一行,將開頭多餘的空格去掉(因為我本來想直接使用
\t
但是發現好像沒有QQ),然後再添加縮排用的空格心得:
先獻上一張,數據庫心電圖
然後就是隨著專案的體量逐漸變大,再加上是使用
python
的關係,也讓我開始逐漸擔憂起實際執行的性能,以及這樣的等待時間是否是可以接受的,但也同樣感受到python
所帶來的限制,可能還是需要掌握一門相對速度更快的語言吧,或者是我也應該花更多的時間研究算法,並想辦法在實際的項目中實踐。隨著這個專案的進度不斷地推進,我也開始考量更多跟使用者相關的東西,比如怎麼才能提升使用者的體驗,怎麼才能效果更好,也因為這些因為,有時候會把自己當成使用者,針對很多地方的使用進行一些修改。
然後這幾天的作息真的是不太對,起的很晚,然後也花了蠻多時間在專案和研究一些其他的東西或者耍廢,導致其實我學習歷程檔案還沒認證QQ,不確定會不會短暫停更(等我先把學習歷程檔案趕一下)
之前沒有很看重算法,但其實後來發現可能如果規模持續擴大的花,一定會有一天碰到算法(但是後端的話應該暑假學一下
node.js
吧,但近期應該就是看怎麼優化python
自己的性能,看是要AsyncIo
還是Thread
)然後下一篇應該就是研究和使用
APScheduler
以及將搜索功能整合進整個的提醒系統。