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 的内存,之后我收到“在文件 text\qharfbuzzng.cpp,第 626 行:内存不足”错误。我的问题是:程序开始占用 2 倍以上的文件内存是否正常,我应该分块读取它还是我做错了什么?

4

1 回答 1

0

警告以下所有假设的QVector行为类似于std::vector

是的,这很正常。发生的情况是,当您有 1024 个元素并且想要读取另一个元素时,调用resize是为 2048 个元素分配容量,将前 1024 个元素移入,然后构造第 1025 个元素。它销毁旧数组,并将内存返回给堆(但不返回给操作系统)。然后,当您读取第 2049 个元素时,它会再次执行所有操作,只是这次分配了 4096 个元素。堆有一块 1024 个元素的空间,但是当你想要 4096 时这是没有用的。现在堆中有 1024、2048 和 4096 个元素的块(其中两个是空闲的并且可以重用)。

重复直到你读完文件。你会看到你最终得到(大约)两倍的文件大小。

第一条规则是“不要担心”——这通常不是问题。然而,对你来说,它显然是。

可以切换到 64 位程序吗?那应该可以解决问题。

另一种选择是猜测您有多少元素(根据文件大小)并.reserve在开始时调用向量。

于 2015-12-12T10:23:11.630 回答