→ loveme00835: 你讀檔是怎麼找的? 10/26 17:43
fgets 去找跟 inString 一樣的字串 (inString 是使用Socket接收)
#define FILELIST "./../db/list.txt"
...(略)
FILE *fp = fopen(FILELIST,"r");
char lineStr[64]; // put every line here.
if(fp){
while(fgets(lineStr, sizeof(lineStr), fp) != NULL){
removeNextLine(lineStr);
if(strcmp(lineStr,inString)==0){
printf("SQLHandler::checkExist: file exist.\n");
fclose(fp);
return 1;
}
}
}else{
printf("error: SQLHandler::checkExist: File open faild.\n");
}
return 0;
※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/26/2019 18:48:03
※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/26/2019 18:51:26
→ nh60211as: 要不要先試試把檔名讀進來然後建tree再找 10/26 20:03
→ Schottky: 如果拼速比不過 grep 何不直接用 grep XDDDD 10/26 20:28
→ Schottky: 一個不到 20MB 的小檔案找個十分鐘是有點久 10/26 20:31
→ Schottky: 但問題絕對不是出在資料庫上 10/26 20:31
對吼,之前寫Python有做過,突然想起來。
※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/26/2019 21:30:35
可是之後如果我要對每一行多加一個屬性的話,那麼不是很麻煩嗎...?
我還是比較想要用資料庫,這樣以後想增加功能比較簡單。
※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/26/2019 21:50:58
→ loveme00835: 依你現在的邏輯, 用資料庫可能也不會完全發揮特性 10/26 22:10
→ loveme00835: 瓶頸在字串比對這裡, 太多餘了, 你可以先做前處理分 10/26 22:11
→ loveme00835: 成幾個只擁有部分資訊的檔案, 這個觀念你在資料庫建 10/26 22:12
→ loveme00835: 表也用得到 10/26 22:12
推 Schottky: 我覺得瓶頸不太像是在 strcmp(),兇手另有其人 10/26 22:40
→ Schottky: 但沒有完整程式碼也沒辦法診斷,我的水晶球送修了 10/26 22:41
因為我在建立List.txt,先有30萬個檔案名稱的迴圈,每一個檔案都要確認是否存在
List 裡面。 而且是單執行序,碰上CPU bound
所以複雜度大概是O(n^2)
→ Schottky: 增加屬性就算是用資料庫一樣麻煩好嗎,還要加資料庫欄位 10/26 22:42
→ Schottky: txt 檔你用 python 寫個程式去每行加上新屬性還不是一樣 10/26 22:43
→ Schottky: sqlite 和 mysql 我都用過,你這狀況我會選 sqlite 10/26 22:47
→ Schottky: 因為你只是要讀 local 資料檔,sqlite 不用架 server 10/26 22:48
→ Schottky: 反正你有興趣玩 SQL 當然是趁年輕儘量試試看 XD 10/26 22:55
我是資管系畢業的,修過一年資料庫,就是不想沒事造輪子,所以才想用資料庫阿...
我的問題是C++的資料庫Library太多種了,不知道哪個比較好用。
※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/26/2019 23:32:11
→ loveme00835: 那問題來了: 你覺得時間複雜度真的是 O(n^2) 嗎? 有 10/27 00:11
→ loveme00835: 輪子你也要會開才行 10/27 00:11
就是想問其他人都怎麼開...
→ taies: 想問問每個檔案都要確認存在的目的是? 感覺主要慢在這 10/27 00:29
防止重複而已,但是我還沒優化。
→ loveme00835: 簡單舉個例子, 創一個 List-a.txt 檔案裡面包含的只 10/27 00:41
→ loveme00835: 有檔名是 a 開頭的項目, 這樣簡單的處理就可以讓搜尋 10/27 00:42
→ loveme00835: 速度快不少, 還有如果你只是想搜尋檔名, 為什麼連屬 10/27 00:42
→ loveme00835: 性也要一併讀進來? 搜尋的方法有很多, 你卻選了最爛 10/27 00:43
→ loveme00835: 的然後說想用資料庫加速, 結果資料庫也是另外建索引 10/27 00:44
→ loveme00835: 阿! 而且前面關鍵字都給了, 谷歌一下看範例應該不難 10/27 00:45
→ loveme00835: , 怕是怕連搜尋方法都懶得想, 那建表格看 API 文件更 10/27 00:46
→ loveme00835: 難我想你應該也做不了 10/27 00:46
這樣的確快很多,可是我還是想問問大家都怎麼在C++裡用資料庫...
※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/27/2019 01:20:31
推 Schottky: 好好一個 O(N) 的程式被寫成 O(N^2) 是發生什麼事 XD 10/27 01:15
→ Schottky: 就算你每個檔案都要確認存在,那還是 O(N+N) 而已啊 10/27 01:21
→ Schottky: 我還是那句,想用 SQL 資料庫就 sqlite 最簡便 10/27 01:23
→ Schottky: 但問題是 sqlite 解決不了你的 O(N^2) 10/27 01:23
→ taies: 如果只是要練習資料庫的話 我覺得換個例子會比較好 10/27 01:44
→ taies: 至於要換哪種 我沒用過資料庫沒辦法給建議了 10/27 01:45
我其實是在練習寫Socket,這是伺服器端的程式。(先不要考慮安全性)
我希望Client端能夠傳送"g_l"時,能夠製作出檔案清單並回傳。
傳送"r_1111"時,能夠收到名稱為1111的圖片。
還有,假設未來我想搜尋屬性有"雙馬尾"及"獸耳"的圖片,之後能夠快速的製作出清單。
未來練習OpenCV的時候,可以增加欄位,把圖片是否有人臉、圖片的色調都加進去。
現在只是卡在造輪子有點麻煩,但是又不太清楚C++怎麼用資料庫而已。
※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/27/2019 02:00:45
推 Schottky: 怎麼用資料庫,官網就有說明文件和程式範例 10/27 10:20
→ klsdf: QT的QODBC可以研究 10/29 23:27
→ klsdf: 不會編了話應該也有編好的lib能用 10/29 23:28