0

次の方法でいくつかのデータをファイルに書き込みました。

result = new QHash<QPair<int, int>, QVector<double> >;
QFile resfile("result.txt");
resfile.open(QIODevice::WriteOnly | QIODevice::Append);
QDataStream out(&resfile);
while(condition)
{
QString s=" something";
out<<s;
res->insert(QPair<int, int>(arange,trange),coeffs);
out<<res;
}

ファイルは最終的に 484MB になりました。その後、私はループでそれを読みました:

QString s;
QVector<QHash<QPair<int, int>, QVector <double> > >    thickeness_result;
QFile resfile("result.txt");
resfile.open(QIODevice::ReadOnly);
QDataStream out(&resfile);
while (!out.atEnd())
{
 thickeness_result.resize(thickeness_result.size()+1);
out>>s>>thickness_result.last();   
 }

この読み取りループの実行中に、タスク マネージャーでプログラムが約 1300MB のメモリを消費し始め、その後、「In file text\qharfbuzzng.cpp, line 626: Out of memory」というエラーが表示されます。私の質問は次のとおりです。プログラムが 2 倍以上のサイズのファイル メモリを使用し始め、それをチャンクで読み取る必要があるのは正常ですか、それとも何か間違っていますか?

4

1 に答える 1

0

警告QVector以下はすべて、次のように動作することを前提としていますstd::vector

はい、正常です。何が起こっているかというと、1024 個の要素があり、別の要素を読みたい場合、 への呼び出しresizeで 2048 個の要素の容量が割り当てられ、最初の 1024 個の要素が移動され、1025 番目の要素が構築されます。古い配列を破棄し、メモリをヒープに返します (オペレーティング システムには返しません)。次に、2049 番目の要素を読み取るようになると、すべてが再び実行されますが、今回は 4096 要素が割り当てられます。ヒープには 1024 要素の領域のチャンクがありますが、4096 が必要な場合は役に立ちません。これで、ヒープ内に 1024、2048、および 4096 要素のチャンクができました (そのうちの 2 つは解放されており、再利用できます)。

ファイルを読み取るまで繰り返します。ファイル サイズが (約) 2 倍になることがわかります。

最初のルールは「気にしない」ことです。通常は問題ありません。しかし、あなたにとっては明らかにそうです。

64 ビット プログラムに切り替えることはできますか? これで問題は解決するはずです。

もう 1 つのオプションは、(ファイル サイズから) 要素の数を推測.reserveし、最初にベクターを呼び出すことです。

于 2015-12-12T10:23:11.630 に答える