gpt4 book ai didi

c++ - SQLite 在 252 个条目处停止

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:10 25 4
gpt4 key购买 nike

所以我编写了一些 C++ 代码来从一个数据库中选择数据并将其INSERT 到另一个数据库中。源数据库中有超过 50,000 个条目。目标数据库的表定义如下:

CREATE TABLE evidence_master
( id INTEGER NOT NULL,
person_id TEXT NOT NULL,
message TEXT,
eid INTEGER NOT NULL,
frequency INTEGER,
string TEXT,
CONSTRAINT id_pk PRIMARY KEY (id),
CONSTRAINT eid_fk FOREIGN KEY (eid) REFERENCES evidences(eid)
);

CREATE TABLE evidences
(
eid INTEGER NOT NULL,
evidence_name TEXT,
CONSTRAINT eid_pk PRIMARY KEY (eid)
);

源数据库是在这里找到的:http://wing.comp.nus.edu.sg/SMSCorpus/

我的问题是,当它到达第 252 个条目时,它声称无法打开数据库(编辑:目标数据库)。尽管已成功完成 251 个条目的工作。

为什么会这样?

编辑:这是从源代码中选择的代码:

dbOpenFail=sqlite3_open("../../../db/smscorpus.db", &dbCorpus);
if(dbOpenFail)
{
cerr << "Can't open sms corpus: " << sqlite3_errmsg(dbCorpus);
}

if(sqlite3_prepare(dbCorpus,
queryCorpus.data(),
queryCorpus.length() + 1,
&preparedCorpusQuery, NULL) != SQLITE_OK)
{
cerr << "Failed to prepare corpus query: " << queryCorpus << zErrMsg << endl;
sqlite3_free(zErrMsg);
}
rowSelectCorpus=sqlite3_step(preparedCorpusQuery);
while(rowSelectCorpus != SQLITE_DONE) //need to go through 51652 messages from corpus
{
if(rowSelectCorpus == SQLITE_ROW)
{
personID = sqlite3_column_text(preparedCorpusQuery, 0); //get sender ID
messageContent = sqlite3_column_text(preparedCorpusQuery, 1); //get message itself
db_entry d1(string(reinterpret_cast<const char *>(personID)),
string(reinterpret_cast<const char *>(messageContent)));
insertResult = d1.insertIntoDatabase();
if(insertResult == -1)
{
return 0; //exit
}

}
rowSelectCorpus=sqlite3_step(preparedCorpusQuery);
}

最佳答案

某些 C 运行时库的默认限制为每个进程 256 个打开的文件句柄。

显然,您的程序会为每个 INSERT 操作打开数据库,而忘记关闭它。

您应该只打开每个数据库一次。

关于c++ - SQLite 在 252 个条目处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15915979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com