4

我是 Qt 新手,需要加载和处理一些大文件。相反,我的内存不足。以下代码说明了我的问题:

QByteArray mem;
for(int i=1; i<=20; ++i)
{
    std::cout << "eating " << (i * 100) << "MB";
    mem.resize(i * 100 * 1024 * 1024);
}

当它达到 600MB 时,我得到了 std::bad_alloc。那真的不应该发生。是否有增加堆大小的秘密开关?

我在 Windows 上使用 Qt 5.0.2 和 Visual C++ 10.0 x86 编译器。

4

2 回答 2

5

AFAIKQByteArray分配一个连续的内存块。虽然您的应用程序可能仍有大量可用的虚拟内存,但很有可能分配给您的数组的当前内存块无法进一步扩展,因为您的内存管理器没有足够大的连续块。

如果您需要处理一些大文件,而不是分配内存并将它们以一个块的形式加载到内存中,我建议您查看将“视口”映射到文件中的内存并以这种方式处理它。根据文件的大小,您很可能能够将整个文件内存映射到一个块中的内存中。这在 Windows 上也比逐字节加载文件更有效,因为它利用虚拟内存系统在相关文件中分页。

于 2013-06-21T23:24:48.967 回答
2

在 Windows 上,32 位进程可以有 2 GB 的堆内存。如果此内存不包含足够大以处理您的 Bytearray 的连续块,您将遇到错误分配异常。

MSVC 知道/LARGEADDRESSAWARE(处理大地址)/HEAP(设置堆大小)链接器选项。

您可以检查对这些的任何更改是否会影响您一次可以分配的字节数。

在我的 x64 机器上,在 MSVC2012 上使用 /MACHINE:X86 编译的可执行文件会针对 >=1200MB 的单个分配引发错误的分配异常。

如果我添加/LARGEADDRESSAWARE到链接器命令行,程序将继续运行,直到它在eating 2100MB.

如果我改用 /MACHINE:X64 进行编译,则该进程将块分配给 8000MB,没有任何异常(可能更多,但我只测试到 8GB)。

于 2013-06-22T00:23:57.350 回答