我正在尝试从文本文件中读取数据并将 token 保存在 Windows 上运行的 SQLite 数据库中 文件大小约为 300MB,问题是我还没有使用线程,应用程序崩溃并卡在“未响应”消息中 这是我的代码
QDir dir(ui->lineEdit->text());
if(dir.exists() && ui->lineEdit->text()!=""){
CreateTables();
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
dir.setSorting(QDir::Size | QDir::Reversed);
QFileInfoList list = dir.entryInfoList();
for (int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
QFile file(ui->lineEdit->text()+"/"+ fileInfo.fileName());
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QSqlQuery qrry;
qrry.prepare( "INSERT INTO documents (path) VALUES ('"+ui->lineEdit->text()+"/"+ fileInfo.fileName()+"')" );
qrry.exec();
QString line;
QTextStream in(&file);
int lineCount=0;
while (!in.atEnd()) {
line = in.readLine();
lineCount++;
QRegExp rx("(\\ |\\,|\\.|\\:|\\t)");
QStringList line_tokens = line.split(rx);
for(int i=0;i<line_tokens.length();i++){
if(line_tokens[i].length()>3){
QSqlQuery qry;
qry.prepare( "INSERT INTO tokens (token,path,line) VALUES ('"+line_tokens[i]+"', '"+ui->lineEdit->text()+"/"+ fileInfo.fileName()+"','"+QString::number(lineCount)+"')" );
qry.exec();
}
}
}
}
else{
QMessageBox::information(this,"File Read Error","Couldn't Open File, Please Make Sure That This File Is Accessable And Readable !");
}
std::cout << std::endl;
}
}
else{
QMessageBox::critical(this,"Directory choosen is Not Valid","Please Make Sure That You Have Choosen A Valid Directory!");
}
它适用于小文件大小,但当涉及大量数据时,它会给出“无响应”消息
线程会不会使应用程序崩溃?? 以及我如何实现线程来为超过 20 个 15 MB 的文件完成这项工作
最佳答案
首先,您可以简单地...等到它处理完所有数据。如果你应该只运行这个程序一次,没关系。
那么,你不应该生成这样的数据库请求流。运行一个大的插入比运行许多小的要好得多。您可以使用 batch
执行。
那么,可能没有理由尝试并行写入 Db。我认为,它足够聪明,可以有效地管理写作。
但值得并行解析。这里最好的解决方案是使用 QtConcurrent
框架。它正是为此类任务而设计的。
关于c++ - Qt 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8593719/