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% 开始,在我的 8gb 内存的大约 65% 处结束。

有什么问题?

4

2 回答 2

2

您必须意识到您的矩阵的大小为 100 000 x 300,即它包含 30 000 000 个QString对象
~> 在构造矩阵之后,这些字符串仍然是空的 ~> 在您填充矩阵时,每个新字符串还会导致要分配的小内存块(由 内部使用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

在大多数现代操作系统中,如果您分配了相当大的内存块,操作系统只会保留虚拟空间,但只有在您写入内存(或从中读取)后,操作系统才会用一些物理内存填充它。

此外,向量中的字符串可能占据了大部分空间(除非字符串确实非常小。

于 2013-09-06T18:00:28.433 回答