从文件中读取的数据占用的内存比文件大小多
Data read from file takes way more memory than file size
我已经通过以下方式将一些数据写入文件:
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 的内存,然后我收到一个 "In file text\qharfbuzzng.cpp, line 626: Out of memory" 错误。
我的问题是:程序开始占用超过 2 倍大小的文件内存是否正常,我应该分块读取它还是我做错了什么?
警告 以下所有假设 QVector
的行为类似于 std::vector
是的,这很正常。发生的事情是,当您有 1024 个元素,并且想要读取另一个元素时,对 resize
的调用正在为 2048 个元素分配容量,将前 1024 个元素移入,然后构造第 1025 个元素。它会破坏旧数组,并将 returns 内存分配给堆(但不会分配给操作系统)。然后当你读到第 2049 个元素时,它又做了一遍,只是这次分配了 4096 个元素。堆有 1024 个元素 space 的块,但是当你想要 4096 个元素时那是没有用的。现在你在堆中有 1024、2048 和 4096 个元素的块(其中两个是免费的并且可以重用)。
重复直到你读完文件。你会看到你最终得到(大约)两倍的文件大小。
第一个规则是 "don't worry about it" - 这通常不是问题。但是,对你来说显然是。
可以切换到 64 位程序吗?这应该可以解决问题。
另一种选择是猜测您有多少元素(根据文件大小)并在开始时对向量调用 .reserve
。
我已经通过以下方式将一些数据写入文件:
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 的内存,然后我收到一个 "In file text\qharfbuzzng.cpp, line 626: Out of memory" 错误。 我的问题是:程序开始占用超过 2 倍大小的文件内存是否正常,我应该分块读取它还是我做错了什么?
警告 以下所有假设 QVector
的行为类似于 std::vector
是的,这很正常。发生的事情是,当您有 1024 个元素,并且想要读取另一个元素时,对 resize
的调用正在为 2048 个元素分配容量,将前 1024 个元素移入,然后构造第 1025 个元素。它会破坏旧数组,并将 returns 内存分配给堆(但不会分配给操作系统)。然后当你读到第 2049 个元素时,它又做了一遍,只是这次分配了 4096 个元素。堆有 1024 个元素 space 的块,但是当你想要 4096 个元素时那是没有用的。现在你在堆中有 1024、2048 和 4096 个元素的块(其中两个是免费的并且可以重用)。
重复直到你读完文件。你会看到你最终得到(大约)两倍的文件大小。
第一个规则是 "don't worry about it" - 这通常不是问题。但是,对你来说显然是。
可以切换到 64 位程序吗?这应该可以解决问题。
另一种选择是猜测您有多少元素(根据文件大小)并在开始时对向量调用 .reserve
。