我已经通过以下方式将一些数据写入文件:
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的内存,然后我收到一个&#34;在文件文本\ qharfbuzzng.cpp,第626行:内存不足&#34 ;错误。 我的问题是:程序开始占用超过2倍大小的文件内存是否正常,我应该以块的形式读取它还是我做错了什么?
答案 0 :(得分:0)
警告以下所有内容均假定QVector
的行为与std::vector
相似
是的,这是正常的。发生的事情是,当你有1024个元素,并且想要读取另一个元素时,对resize
的调用是为2048个元素分配容量,移动前1024个元素,然后构造第1025个元素。它会销毁旧数组,并将内存返回堆(但不会返回给操作系统)。然后,当你来阅读第2049个元素时,它会再次完成所有这一切,只是这次分配了4096个元素。堆有1024个元素空间的块,但是当你想要4096时没有用。现在堆中有1024个,2048个和4096个元素块(其中两个是免费的并且可以重用)。
重复直到您已阅读该文件。您将看到最终得到(大约)文件大小的两倍。
第一条规则是&#34;不要担心它&#34; - 它通常不是问题。但是,对你来说显然是。
您可以切换到64位程序吗?这应该会让问题消失。
另一种选择是猜测你有多少元素(来自文件大小)并在开始时调用向量上的.reserve
。