0

1 億 5000 万行を含むテーブルを持つデータベースがあります。列は次のとおりです。

id (INTEGER), value_one (INTEGER), value_two (INTEGER), value_3 (INTEGER)

このすべてのデータを にインポートする必要がありますが、クエリを実行しているときにQListQt がアサートするという問題が発生しています。~700 万のエントリを含むテーブルで同じコードを実行でき、エラーなく動作します。qAllocMore: 'Requested size is too large!', file tools\qbytearray.cpp, line 73SELECT

これは私のSELECT声明です:

 bool e = query.exec("SELECT * FROM DocumentTerms");
 if (!e) {
     qWarning() << __FUNCTION__ << "\tError: " << query.lastError().text();
 }
 while (query.next()) {
     int docId = query.value(1).toInt();
     int termId = query.value(2).toInt();
     int frequency = query.value(3).toInt();
     //store it in a QHash<int, QPair<int, int>>
 }

ループを反復しているように見えquery.nextますが、約 1600 万回の反復後にアサートがポップアップします。何が原因ですか?

4

1 に答える 1

1

私の以前の答えはナンセンスでした。愚かな計算バグ。しかし、私は今、解決策を持っていると思います。欠けているのは一般的な記憶ではなく、連続した記憶です。

私は次のことを試しました:

QList<int> testlist;
for(int i = 0; i < 150000000;++i){
    testlist << i << i << i << i;
}

ばかげた小さなコードは、他に何もせず、4 つの int を 150000000 回リストに入れます。数秒後に取得します:

'std::bad_alloc'
what(): std::bad_allocのインスタンスをスローした後に呼び出される終了

多かれ少なかれ: メモリ不足です。

上記のコードを次のように変更します。

QList<int> testlist;
testList.reserve(150000000*4);
for(int i = 0; i < 150000000;++i){
    testlist << i << i << i << i;
}

このコードは、前のコード以外には何もしません。QList は以前とまったく同じサイズです。ただし、ループを開始する前にすべてのメモリを予約します。結果?リストが大きくなる必要はなく、常に追加のメモリを要求します。このバージョンでは、まったく問題はありませんでした。リストを手に入れました。

于 2013-09-02T01:33:39.707 に答える