看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Centos7,Fedora30 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC,G++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) Mysql資料庫 問題(Question): 想詢問一下在C++中使用SQL比較常用的方法。 目前查到了有 SqLite,SQLAPI++,MySQL Connector/C 完全不知道該使用哪一個... 餵入的資料(Input): 一個帶有屬性、圖片檔名的.txt檔,結構如右: [屬性],檔名\n 資料量約有30萬行 預期結果: 能夠快速查找資料。 補充說明(Supplement): 用讀檔的方式找檔名太慢了,30萬行隨便找找都要超過10分鐘。 所以我才想用資料庫,但是C++的資料庫似乎沒那麼簡單。 希望各位能夠給我點建議~謝謝~。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.45.73.249 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1572080868.A.9A3.html
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
Schottky: https://www.sqlite.org/quickstart.html 直接抄就好 10/27 10:22
klsdf: QT的QODBC可以研究 10/29 23:27
klsdf: 不會編了話應該也有編好的lib能用 10/29 23:28
tomjpsun: https://github.com/viaduck/mariadbpp 還不錯用 11/25 15:07