2

そこで、あるデータベースからデータを選択し、別のデータベースにデータを選択するための 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);
}
4

1 に答える 1

1

一部の C ランタイム ライブラリには、プロセスごとに 256 個の開いているファイル ハンドルの既定の制限があります。

どうやら、あなたのプログラムは操作ごとにデータベースを開いていますがINSERT、閉じるのを忘れています。

すべてのデータベースは一度だけ開く必要があります。

于 2013-04-10T07:17:25.773 に答える