[問題][SQL]關於C++使用資料庫

看板C_and_CPP作者 (超帥肥宅)時間4年前 (2019/10/26 17:07), 4年前編輯推噓3(3035)
留言38則, 6人參與, 4年前最新討論串1/1
開發平台(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

10/26 17:43, 4年前 , 1F
你讀檔是怎麼找的?
10/26 17:43, 1F
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

10/26 20:03, 4年前 , 2F
要不要先試試把檔名讀進來然後建tree再找
10/26 20:03, 2F

10/26 20:28, 4年前 , 3F
如果拼速比不過 grep 何不直接用 grep XDDDD
10/26 20:28, 3F

10/26 20:31, 4年前 , 4F
一個不到 20MB 的小檔案找個十分鐘是有點久
10/26 20:31, 4F

10/26 20:31, 4年前 , 5F
但問題絕對不是出在資料庫上
10/26 20:31, 5F
對吼,之前寫Python有做過,突然想起來。 ※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/26/2019 21:30:35 可是之後如果我要對每一行多加一個屬性的話,那麼不是很麻煩嗎...? 我還是比較想要用資料庫,這樣以後想增加功能比較簡單。 ※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/26/2019 21:50:58

10/26 22:10, 4年前 , 6F
依你現在的邏輯, 用資料庫可能也不會完全發揮特性
10/26 22:10, 6F

10/26 22:11, 4年前 , 7F
瓶頸在字串比對這裡, 太多餘了, 你可以先做前處理分
10/26 22:11, 7F

10/26 22:12, 4年前 , 8F
成幾個只擁有部分資訊的檔案, 這個觀念你在資料庫建
10/26 22:12, 8F

10/26 22:12, 4年前 , 9F
表也用得到
10/26 22:12, 9F

10/26 22:40, 4年前 , 10F
我覺得瓶頸不太像是在 strcmp(),兇手另有其人
10/26 22:40, 10F

10/26 22:41, 4年前 , 11F
但沒有完整程式碼也沒辦法診斷,我的水晶球送修了
10/26 22:41, 11F
因為我在建立List.txt,先有30萬個檔案名稱的迴圈,每一個檔案都要確認是否存在 List 裡面。 而且是單執行序,碰上CPU bound 所以複雜度大概是O(n^2)

10/26 22:42, 4年前 , 12F
增加屬性就算是用資料庫一樣麻煩好嗎,還要加資料庫欄位
10/26 22:42, 12F

10/26 22:43, 4年前 , 13F
txt 檔你用 python 寫個程式去每行加上新屬性還不是一樣
10/26 22:43, 13F

10/26 22:47, 4年前 , 14F
sqlite 和 mysql 我都用過,你這狀況我會選 sqlite
10/26 22:47, 14F

10/26 22:48, 4年前 , 15F
因為你只是要讀 local 資料檔,sqlite 不用架 server
10/26 22:48, 15F

10/26 22:55, 4年前 , 16F
反正你有興趣玩 SQL 當然是趁年輕儘量試試看 XD
10/26 22:55, 16F
我是資管系畢業的,修過一年資料庫,就是不想沒事造輪子,所以才想用資料庫阿... 我的問題是C++的資料庫Library太多種了,不知道哪個比較好用。 ※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/26/2019 23:32:11

10/27 00:11, 4年前 , 17F
那問題來了: 你覺得時間複雜度真的是 O(n^2) 嗎? 有
10/27 00:11, 17F

10/27 00:11, 4年前 , 18F
輪子你也要會開才行
10/27 00:11, 18F
就是想問其他人都怎麼開...

10/27 00:29, 4年前 , 19F
想問問每個檔案都要確認存在的目的是? 感覺主要慢在這
10/27 00:29, 19F
防止重複而已,但是我還沒優化。

10/27 00:41, 4年前 , 20F
簡單舉個例子, 創一個 List-a.txt 檔案裡面包含的只
10/27 00:41, 20F

10/27 00:42, 4年前 , 21F
有檔名是 a 開頭的項目, 這樣簡單的處理就可以讓搜尋
10/27 00:42, 21F

10/27 00:42, 4年前 , 22F
速度快不少, 還有如果你只是想搜尋檔名, 為什麼連屬
10/27 00:42, 22F

10/27 00:43, 4年前 , 23F
性也要一併讀進來? 搜尋的方法有很多, 你卻選了最爛
10/27 00:43, 23F

10/27 00:44, 4年前 , 24F
的然後說想用資料庫加速, 結果資料庫也是另外建索引
10/27 00:44, 24F

10/27 00:45, 4年前 , 25F
阿! 而且前面關鍵字都給了, 谷歌一下看範例應該不難
10/27 00:45, 25F

10/27 00:46, 4年前 , 26F
, 怕是怕連搜尋方法都懶得想, 那建表格看 API 文件更
10/27 00:46, 26F

10/27 00:46, 4年前 , 27F
難我想你應該也做不了
10/27 00:46, 27F
這樣的確快很多,可是我還是想問問大家都怎麼在C++裡用資料庫... ※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/27/2019 01:20:31

10/27 01:15, 4年前 , 28F
好好一個 O(N) 的程式被寫成 O(N^2) 是發生什麼事 XD
10/27 01:15, 28F

10/27 01:21, 4年前 , 29F
就算你每個檔案都要確認存在,那還是 O(N+N) 而已啊
10/27 01:21, 29F

10/27 01:23, 4年前 , 30F
我還是那句,想用 SQL 資料庫就 sqlite 最簡便
10/27 01:23, 30F

10/27 01:23, 4年前 , 31F
但問題是 sqlite 解決不了你的 O(N^2)
10/27 01:23, 31F

10/27 01:44, 4年前 , 32F
如果只是要練習資料庫的話 我覺得換個例子會比較好
10/27 01:44, 32F

10/27 01:45, 4年前 , 33F
至於要換哪種 我沒用過資料庫沒辦法給建議了
10/27 01:45, 33F
我其實是在練習寫Socket,這是伺服器端的程式。(先不要考慮安全性) 我希望Client端能夠傳送"g_l"時,能夠製作出檔案清單並回傳。 傳送"r_1111"時,能夠收到名稱為1111的圖片。 還有,假設未來我想搜尋屬性有"雙馬尾"及"獸耳"的圖片,之後能夠快速的製作出清單。 未來練習OpenCV的時候,可以增加欄位,把圖片是否有人臉、圖片的色調都加進去。 現在只是卡在造輪子有點麻煩,但是又不太清楚C++怎麼用資料庫而已。 ※ 編輯: zo6596001 (114.45.73.249 臺灣), 10/27/2019 02:00:45

10/27 10:20, 4年前 , 34F
怎麼用資料庫,官網就有說明文件和程式範例
10/27 10:20, 34F

10/27 10:22, 4年前 , 35F
10/27 10:22, 35F

10/29 23:27, 4年前 , 36F
QT的QODBC可以研究
10/29 23:27, 36F

10/29 23:28, 4年前 , 37F
不會編了話應該也有編好的lib能用
10/29 23:28, 37F

11/25 15:07, 4年前 , 38F
11/25 15:07, 38F
文章代碼(AID): #1Tj0pacZ (C_and_CPP)