0

事前に割り当てられたメモリに文字列の分割を保存しているときに、すべての行を (同じ変数に) 読み込むと、メモリが直線的に増加していることをシステム モニターが示している理由がわかりません。

// pre-allocate
int rows = 100000;
int columns = 300;
QVector<QString> matrix_row;
matrix_row.resize(rows);
QVector< QVector<QString> > matrix;
matrix.resize(num_columns);
qFill(matrix.begin(), matrix.end(), matrix_row);

int current_row = 0;
while(!filestream.atEnd())
{
        QString line = filestream.readLine();
        for (int i = 0; i < num_columns; i++)
        {
           matrix[i][current_row] = line.left(end[i]).right(grom[i]);
        }
        ++current_row;
}

スピードが気になるので、何かがおかしいのではないかと思っています。

初期割り当ての約 26% で開始し、8 GB の RAM の約 65% で終了します。

何が間違っている可能性がありますか?

4

2 に答える 2

2

行列のサイズが 100 000 x 300 であることを認識する必要があります。つまり、30 000 000QString個のオブジェクトを保持します
~> 行列が構築された直後、これらの文字列はまだ空です ~> 行列を埋めるまでに、新しい文字列ごとにさらに小さなメモリ ブロック ( によって内部的に使用されるQString) が割り当てられるため、アプリケーションのメモリ要件は増え続けます。

QVector複雑なオブジェクトであり、その要素に必要なスペースよりも少し多くのスペースを必要とするため、この小さな間違いも問題になります。resize行の長さrowsを にresizeし、行列の行数を に等しくする必要がありますcolumns。それは反対の方法であるべきです。

また、前述の変更を適用した後でも、このコード:

QVector<QString> matrix_row;
matrix_row.resize(columns);
QVector< QVector<QString> > matrix;
matrix.resize(rows);
qFill(matrix.begin(), matrix.end(), matrix_row);

これと同等です:

QVector< QVector<QString> > matrix(rows, QVector<QString>(columns) );
于 2013-09-06T17:58:29.767 に答える
1

最新のほとんどのオペレーティング システムでは、かなり大きなメモリ チャンクを割り当てた場合、OS は仮想空間を予約するだけですが、メモリに書き込む (またはメモリから読み取る) と、OS はその仮想空間に物理メモリを追加します。

さらに、ベクトル内の文字列は、おそらくスペースの大部分を占めるものです (文字列が実際に非常に小さい場合を除きます.

于 2013-09-06T18:00:28.433 に答える