(利用索引)大資料查詢
編譯環境:QT5(建立時選擇的是widget)
主要是將一個大檔案拆成多個小檔案,這樣子就能夠大大地節省了搜尋的時間。
主要程式碼如下:
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.resize(600,400);
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QTextCodec> //ASCII轉UTF-8
#include <QCursor>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
setWindowTitle("酒店入住記錄查詢");
label1=new QLabel();
label1->setText("檔案大小1.27GB\n記錄數20151574");
label2=new QLabel();
label2->setText("請輸入要查詢的姓名:");
btn1=new QPushButton();
btn1->setText("查詢");
edit1=new QLineEdit();
text1=new QTextBrowser();
QHBoxLayout *layout1=new QHBoxLayout();
layout1->addWidget(label2);
layout1->addWidget(edit1);
layout1->addWidget(btn1);
QVBoxLayout *layout2=new QVBoxLayout(this);
layout2->addWidget(label1);
layout2->addLayout(layout1);
layout2->addWidget(text1);
connect(btn1,SIGNAL(clicked()),this,SLOT(on_clicked())); //將btn1與on_clicked()關聯
}
Widget::~Widget()
{
}
void Widget::select(int n) //n==1代表查詢原始資料檔案 n==2查詢索引檔案
{
clock_t start=clock(); //執行效率計時開始
QTextCodec *codec=QTextCodec::codecForName("GBK");
char key[2048]={0};
char content[2048]={0};
const char*s= codec->fromUnicode(edit1->text().trimmed()).data();//將edit1中的內容從QString轉化為const char*
strcpy(key,s);
if(strlen(key)<4)
{
QMessageBox::information(this,"錯誤","輸入不正確,請重新輸入");
return;
}
key[strlen(key)]=',';
char path[1024]={0};
if(n == 1)
strcpy(path,"D:/Documents/code/hotel/db/kaifang_noBomb.txt");
else if(n ==2)
{
int index=((unsigned char)key[0]+(unsigned char)key[1]+(unsigned char)key[2]+(unsigned char)key[3])%256;
sprintf(path,"D:/Documents/code/hotel/db/index/%d.db",index);
}
FILE *p=fopen(path,"r");
if(!p)
{
QString str=path;
str+="開啟失敗";
QMessageBox::information(this,"錯誤",str);
return ;
}
this->setCursor(Qt::WaitCursor);
text1->clear();
unsigned int count=0; //計數器
while(!feof(p))
{
memset(content,0,sizeof(content));
fgets(content,sizeof(content),p);
if(content[strlen(content)-1] == '\n')
content[strlen(content)-1]=0;
if(strncmp(content,key,strlen(key))== 0)
{
text1->append(codec->toUnicode(content));
count++;
}
}
clock_t end=clock();
this->setCursor(Qt::ArrowCursor);
fclose(p);
QString res="找到"+QString::number(count)+"條記錄,用時"+QString::number(end-start)+"毫秒";
QMessageBox::information(this,"完成",res);
}
void Widget::create_index()
{
clock_t start=clock();
char path[1024]={0};
strcpy(path,"D:/Documents/code/hotel/db/kaifang_noBomb.txt");
FILE *p=fopen(path,"r");
if(!p)
{
QString str=path;
str+="開啟失敗";
QMessageBox::information(this,"錯誤",str);
return ;
}
FILE *pt[256]={NULL};
//建立256個索引檔案並開啟
for(int i=0;i<256;i++)
{
memset(path,0,sizeof(path));
sprintf(path,"D:/Documents/code/hotel/db/index/%d.db",i);
pt[i]=fopen(path,"w");
}
this->setCursor(Qt::WaitCursor);
char buf[1024]={0};
int index=0; //索引值
while(!feof(p))
{
memset(buf,0,sizeof(buf));
fgets(buf,sizeof(buf),p);
if(buf[strlen(buf)-1] == '\n')
buf[strlen(buf)-1]=0;
//根據關鍵字求索引鍵值
index=((unsigned char)buf[0]+(unsigned char)buf[1]+(unsigned char)buf[2]+(unsigned char)buf[3])%256;
fprintf(pt[index],"%s\n",buf);
}
fclose(p);
for(int i=0;i<256;i++)
{
fclose(pt[i]);
}
clock_t end=clock();
this->setCursor(Qt::ArrowCursor);
QString res="用時"+QString::number(end-start)+"毫秒";
QMessageBox::information(this,"完成",res);
}
void Widget::on_clicked()
{
//QMessageBox::information(this,"提示","按鈕被按了");
select(2);
}
效果圖:
相關文章
- TableStore多元索引,大資料查詢的利器索引大資料
- indexedDB 通過索引查詢資料Index索引
- SQLServer查詢哪些索引利用率低SQLServer索引
- 分塊查詢【大規模資料查詢演算法優化】【索引順序查詢】演算法 PHP 版演算法優化索引PHP
- 【索引】Oracle查詢指定索引提高查詢效率索引Oracle
- AppBoxFuture: 二級索引及索引掃描查詢資料APP索引
- 大資料的實時查詢大資料
- Mybatis學習01:利用mybatis查詢資料庫MyBatis資料庫
- 利用資料泵匯出查詢結果(二)
- 利用資料泵匯出查詢結果(一)
- 大資料量資料查詢最佳化大資料
- 資料結構之三大查詢資料結構
- 利用GitHub大資料查詢介面統計分析最流行的程式碼規範Github大資料
- 巧用函式索引解決資料傾斜列查詢函式索引
- 比較有索引和無索引的查詢速度(在mysql資料庫中)索引MySql資料庫
- 資料庫資料的查詢----連線查詢資料庫
- 資料庫查詢和資料庫(MySQL)索引的最佳化建議資料庫MySql索引
- 為什麼有時Oracle資料庫不用索引來查詢資料?(轉)Oracle資料庫索引
- elasticsearch之多索引查詢Elasticsearch索引
- Elasticsearch(三):索引查詢Elasticsearch索引
- 查詢索引 常用SQL索引SQL
- 查詢相似的索引索引
- MySQL - 資料查詢 - 簡單查詢MySql
- B樹查詢,磁碟查詢資料
- 流式查詢1. mybatis的遊標Cursor,分頁大資料查詢MyBatis大資料
- 資料庫 - 資料查詢資料庫
- “大資料”查詢平臺利用抖音導流,存個人資訊洩露或倒賣風險大資料
- 利用GeoIP資料庫及API進行地理定位查詢資料庫API
- 查詢sqlserver資料庫及各表格空間利用情況SQLServer資料庫
- 提高mysql千萬級大資料SQL查詢優化30條經驗(Mysql索引優化注意)MySql大資料優化索引
- 【索引】反向索引--條件 範圍查詢索引
- Java ——MongDB 插入資料、 模糊查詢、in查詢Java
- 資料庫高階查詢之子查詢資料庫
- 資料庫 - 連線查詢、巢狀查詢、集合查詢資料庫巢狀
- indexedDB 查詢資料Index
- RESTFul資料查詢REST
- MySQL資料查詢MySql
- EF 查詢資料