[專案開發日常—5]

Tags
linebot
飲水機
Last edited
Jan 27, 2022 12:04 PM
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筆每一筆都有兩個部件)構成的雪花屏
notion image
notion image
這邊附上一張不小心露寫兩行代碼,然後出現的雪花屏
這邊附上一張不小心露寫兩行代碼,然後出現的雪花屏
 
送入數據庫後顯示的數據
送入數據庫後顯示的數據
總體來說,檔案大小還可以接受(畢竟是純文字儲存的方式,如果換成excel可能都好幾個mb了),
然後會想用4000筆資料來測是因為比較接近廠商的資料。
 
然後通過line訊息觸發event,得到回覆,實際的耗時大概就是0.21秒(也有0.19的)
 
notion image
這個結果我其實覺得還可以,應付這次的絕對夠,但是還是想之後看看能不能優化一下(但其實在python下身為tle戰士的我,覺得可能也提升不了多少。或許是我菜)
 

繼續測試(8000)

*不用擔心隨著範圍改變我們的解答也會重新生成(隨機分佈在8000筆資料中)
後來覺得好像對這個數據不太滿意,想看看它的極限在哪裡,然後又測了8000筆資料的
生成花了187秒
生成花了187秒
實際搜索耗時
實際搜索耗時
before
before
 
after
after
 
notion image
 

再測試(40000)

這次生成有點久
這次生成有點久
好的文件大大的~
好的文件大大的~
 
40000筆的結果,但耗時也還好
40000筆的結果,但耗時也還好
雖然跟8000相比資料量成長為5倍,但實際耗時也只成長為2倍(這我還是蠻困惑的,但是可能跟電腦當下的心情和狀態也會有關啦,而且因為數字蠻小的,所以有時候波動就特別明顯,可以到0.2左右)
notion image
 
 

、專案結構的一點改動:

主要是我把我常用的debug的一些腳本做了一個簡單的封裝(一方面是考慮到路徑問題,另一方面是為了好整理),然後就簡單整理成這樣。但是主程式目前還是一個小亂的狀態(之後應該也會針對不同功能分出來,個別進行封裝)
 
notion image

四、修改json格式化輸出的程式

因為之前寫的有一個小bug,就是如果是將程式中的陣列直接轉成json字串,然後給程式進行處理,這樣的話一般程式中的陣列在“,”逗號後面都會有一個空格,也就會導致格式化輸出的json在有些情況都會多一個空格(強迫症表示很難受)
後來就是先針對每一行,將開頭多餘的空格去掉(因為我本來想直接使用\t但是發現好像沒有QQ),然後再添加縮排用的空格
 
 

心得:

notion image
先獻上一張,數據庫心電圖
 
然後就是隨著專案的體量逐漸變大,再加上是使用python的關係,也讓我開始逐漸擔憂起實際執行的性能,以及這樣的等待時間是否是可以接受的,但也同樣感受到python所帶來的限制,可能還是需要掌握一門相對速度更快的語言吧,或者是我也應該花更多的時間研究算法,並想辦法在實際的項目中實踐。
隨著這個專案的進度不斷地推進,我也開始考量更多跟使用者相關的東西,比如怎麼才能提升使用者的體驗,怎麼才能效果更好,也因為這些因為,有時候會把自己當成使用者,針對很多地方的使用進行一些修改。
然後這幾天的作息真的是不太對,起的很晚,然後也花了蠻多時間在專案和研究一些其他的東西或者耍廢,導致其實我學習歷程檔案還沒認證QQ,不確定會不會短暫停更(等我先把學習歷程檔案趕一下)
之前沒有很看重算法,但其實後來發現可能如果規模持續擴大的花,一定會有一天碰到算法(但是後端的話應該暑假學一下node.js吧,但近期應該就是看怎麼優化python自己的性能,看是要AsyncIo還是Thread
 

然後下一篇應該就是研究和使用APScheduler以及將搜索功能整合進整個的提醒系統。