从文件读取的数据占用的内存大于文件大小

时间:2015-12-12 10:11:29

标签: c++ qfile qvector qhash qdatastream

我已经通过以下方式将一些数据写入文件:

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倍大小的文件内存是否正常,我应该以块的形式读取它还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

警告以下所有内容均假定QVector的行为与std::vector相似

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

重复直到您已阅读该文件。您将看到最终得到(大约)文件大小的两倍。

第一条规则是&#34;不要担心它&#34; - 它通常不是问题。但是,对你来说显然是。

您可以切换到64位程序吗?这应该会让问题消失。

另一种选择是猜测你有多少元素(来自文件大小)并在开始时调用向量上的.reserve