C++ 从文件中读取的数据占用的内存远大于文件大小

C++ 从文件中读取的数据占用的内存远大于文件大小,c++,qfile,qvector,qhash,qdatastream,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";

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

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;
}
result=newqhash;
QFile resfile(“result.txt”);
open(QIODevice::WriteOnly | QIODevice::Append);
qdata数据流输出(&resfile);
while(条件)
{
QString s=“某物”;
out>thickness_result.last();
}
当这个读取循环运行时,我看到在任务管理器中,我的程序开始占用大约1300MB的内存,然后我收到一个“in file text\qharfbuzzng.cpp,第626行:内存不足”错误。
我的问题是:程序开始占用超过2倍大小的文件内存,我应该分块读取,这是正常的吗?还是我做错了什么?

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

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

重复此操作,直到您已读取该文件。您将看到最终的文件大小是(大约)两倍

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

你能切换到64位程序吗?这应该可以解决问题


另一个选项是猜测您有多少个元素(根据文件大小),并在开始时调用
。在向量上保留

谢谢您的解释!遗憾的是,我会尝试找到一个解决方法,即保留在任何方面都没有帮助。在这种情况下,您的选择是:转换为64位;分块阅读。
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();   
 }