作者zo6596001 (超帅肥宅)
看板C_and_CPP
标题[问题][SQL]关於C++使用资料库
时间Sat Oct 26 17:07:46 2019
开发平台(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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1572080868.A.9A3.html
1F:→ 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
2F:→ nh60211as: 要不要先试试把档名读进来然後建tree再找 10/26 20:03
3F:→ Schottky: 如果拼速比不过 grep 何不直接用 grep XDDDD 10/26 20:28
4F:→ Schottky: 一个不到 20MB 的小档案找个十分钟是有点久 10/26 20:31
5F:→ 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
6F:→ loveme00835: 依你现在的逻辑, 用资料库可能也不会完全发挥特性 10/26 22:10
7F:→ loveme00835: 瓶颈在字串比对这里, 太多余了, 你可以先做前处理分 10/26 22:11
8F:→ loveme00835: 成几个只拥有部分资讯的档案, 这个观念你在资料库建 10/26 22:12
9F:→ loveme00835: 表也用得到 10/26 22:12
10F:推 Schottky: 我觉得瓶颈不太像是在 strcmp(),凶手另有其人 10/26 22:40
11F:→ Schottky: 但没有完整程式码也没办法诊断,我的水晶球送修了 10/26 22:41
因为我在建立List.txt,先有30万个档案名称的回圈,每一个档案都要确认是否存在
List 里面。 而且是单执行序,碰上CPU bound
所以复杂度大概是O(n^2)
12F:→ Schottky: 增加属性就算是用资料库一样麻烦好吗,还要加资料库栏位 10/26 22:42
13F:→ Schottky: txt 档你用 python 写个程式去每行加上新属性还不是一样 10/26 22:43
14F:→ Schottky: sqlite 和 mysql 我都用过,你这状况我会选 sqlite 10/26 22:47
15F:→ Schottky: 因为你只是要读 local 资料档,sqlite 不用架 server 10/26 22:48
16F:→ Schottky: 反正你有兴趣玩 SQL 当然是趁年轻尽量试试看 XD 10/26 22:55
我是资管系毕业的,修过一年资料库,就是不想没事造轮子,所以才想用资料库阿...
我的问题是C++的资料库Library太多种了,不知道哪个比较好用。
※ 编辑: zo6596001 (114.45.73.249 台湾), 10/26/2019 23:32:11
17F:→ loveme00835: 那问题来了: 你觉得时间复杂度真的是 O(n^2) 吗? 有 10/27 00:11
18F:→ loveme00835: 轮子你也要会开才行 10/27 00:11
就是想问其他人都怎麽开...
19F:→ taies: 想问问每个档案都要确认存在的目的是? 感觉主要慢在这 10/27 00:29
防止重复而已,但是我还没优化。
20F:→ loveme00835: 简单举个例子, 创一个 List-a.txt 档案里面包含的只 10/27 00:41
21F:→ loveme00835: 有档名是 a 开头的项目, 这样简单的处理就可以让搜寻 10/27 00:42
22F:→ loveme00835: 速度快不少, 还有如果你只是想搜寻档名, 为什麽连属 10/27 00:42
23F:→ loveme00835: 性也要一并读进来? 搜寻的方法有很多, 你却选了最烂 10/27 00:43
24F:→ loveme00835: 的然後说想用资料库加速, 结果资料库也是另外建索引 10/27 00:44
25F:→ loveme00835: 阿! 而且前面关键字都给了, 谷歌一下看范例应该不难 10/27 00:45
26F:→ loveme00835: , 怕是怕连搜寻方法都懒得想, 那建表格看 API 文件更 10/27 00:46
27F:→ loveme00835: 难我想你应该也做不了 10/27 00:46
这样的确快很多,可是我还是想问问大家都怎麽在C++里用资料库...
※ 编辑: zo6596001 (114.45.73.249 台湾), 10/27/2019 01:20:31
28F:推 Schottky: 好好一个 O(N) 的程式被写成 O(N^2) 是发生什麽事 XD 10/27 01:15
29F:→ Schottky: 就算你每个档案都要确认存在,那还是 O(N+N) 而已啊 10/27 01:21
30F:→ Schottky: 我还是那句,想用 SQL 资料库就 sqlite 最简便 10/27 01:23
31F:→ Schottky: 但问题是 sqlite 解决不了你的 O(N^2) 10/27 01:23
32F:→ taies: 如果只是要练习资料库的话 我觉得换个例子会比较好 10/27 01:44
33F:→ 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
34F:推 Schottky: 怎麽用资料库,官网就有说明文件和程式范例 10/27 10:20
36F:→ klsdf: QT的QODBC可以研究 10/29 23:27
37F:→ klsdf: 不会编了话应该也有编好的lib能用 10/29 23:28