我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset
I'm using std::bitset and trying to create two arrays std::bitset with size 100,000,000,000
我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset。
结果,程序只占了我 298 MB 的 RAM,但必须占 ~24 GB。我有 32 GB RAM,现在有 26 GB 可用。当我为 x86 构建代码时,它编译并可以启动,但对于 x64,它显示以下内容:错误 C2148:数组总大小不得超过 0x7fffffff 字节。
如何修复它而不减小位集数组的大小?
我尝试制作 2 个全局数组。
另外,我在 Microsoft visual studio -> project -> name_project properties -> configuration properties -> linker -> system -> Stack Reserve Size 设置为 25,000,000(我认为必须有 KB,所以我想我已经设置为 ~25 GB)。
... // other libraries
#include <bitset>
std::bitset <100000000000>mas;
std::bitset <100000000000>a1;
int main() {.../* work with the arrays */...}
我想要 运行 具有巨大 std::bitset 数组的代码。
UPD:对于 x86 没问题,但是对于 x64 呢?我的代码检查整个数组并在某一时刻停止。
std::bitset
必须至少(大多数实现使用最小值)使用每八位存储一个字节。对于 1000 亿位,这意味着每个位集需要约 12.5 GB 的内存。问题是,在 32 位系统上,整个程序的最大虚拟内存大小最多为 4 GB。其中一些被进程的内核内存预留占用,所以很可能你只有 2 GB 的虚拟地址 space 可以使用;你正试图使用六倍的量。
你的程序 不能 运行 在 32 位系统上不压缩 bitset
。如果它声称 运行,它可能是一个不同的错误;它将 t运行cating 100_000_000_000
以适应 32 位 size_t
,而是创建 std::bitset<1215752192>
,这将只需要大约 150 MB 的内存,不会造成任何问题。这可以解释您观察到的 298 MB 内存使用情况;内存使用显示使用 "mebibytes"(base-2,而不是 base-10,所以 KiB == 1024 和 MiB == 1048576),这使得每个数组消耗不到 145 MiB,其中两个总共消耗 290 MiB,为程序的其余部分留出 8 MiB(这似乎是合理的)。
如果它实际上因该错误而在 x64 上死机,则您被卡住了;谁实现了你的 std::bitset
(或支持它的任何数据结构,例如 std::array
),即使在 64 位系统上也将它限制为 0x7fffffff
字节,这将限制你 std::bitset
s大约 170 亿比特或更少。您唯一的选择是为您的标准库找到一个不同的提供者,或者自己重新实现它。
更新: 显然你正在使用 Windows,静态数据大小的限制是 2GB(0x7fffffff 字节),even on 64 bit Windows; Windows 可移植可执行文件格式(由 .exe
和 .dll
文件使用)对每个部分使用 32 位偏移和长度,即使对于 64 位可执行文件也是如此。通过使用全局 std::bitset
s,您试图在图像中存储 25 GB 的静态数据,这是行不通的。将它们移动到堆栈(在 main
的主体内声明它们非 static
) 可能 如果你像你那样增加堆栈保留大小,但它是依赖那么大的堆栈仍然是一个坏主意。我建议简单地动态分配 bitset
(例如 auto mas = std::make_unique<std::bitset<100000000000>>()
),或者找到一种更好的方法来使用较小的 bitset
.
我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset。 结果,程序只占了我 298 MB 的 RAM,但必须占 ~24 GB。我有 32 GB RAM,现在有 26 GB 可用。当我为 x86 构建代码时,它编译并可以启动,但对于 x64,它显示以下内容:错误 C2148:数组总大小不得超过 0x7fffffff 字节。 如何修复它而不减小位集数组的大小?
我尝试制作 2 个全局数组。 另外,我在 Microsoft visual studio -> project -> name_project properties -> configuration properties -> linker -> system -> Stack Reserve Size 设置为 25,000,000(我认为必须有 KB,所以我想我已经设置为 ~25 GB)。
... // other libraries
#include <bitset>
std::bitset <100000000000>mas;
std::bitset <100000000000>a1;
int main() {.../* work with the arrays */...}
我想要 运行 具有巨大 std::bitset 数组的代码。
UPD:对于 x86 没问题,但是对于 x64 呢?我的代码检查整个数组并在某一时刻停止。
std::bitset
必须至少(大多数实现使用最小值)使用每八位存储一个字节。对于 1000 亿位,这意味着每个位集需要约 12.5 GB 的内存。问题是,在 32 位系统上,整个程序的最大虚拟内存大小最多为 4 GB。其中一些被进程的内核内存预留占用,所以很可能你只有 2 GB 的虚拟地址 space 可以使用;你正试图使用六倍的量。
你的程序 不能 运行 在 32 位系统上不压缩 bitset
。如果它声称 运行,它可能是一个不同的错误;它将 t运行cating 100_000_000_000
以适应 32 位 size_t
,而是创建 std::bitset<1215752192>
,这将只需要大约 150 MB 的内存,不会造成任何问题。这可以解释您观察到的 298 MB 内存使用情况;内存使用显示使用 "mebibytes"(base-2,而不是 base-10,所以 KiB == 1024 和 MiB == 1048576),这使得每个数组消耗不到 145 MiB,其中两个总共消耗 290 MiB,为程序的其余部分留出 8 MiB(这似乎是合理的)。
如果它实际上因该错误而在 x64 上死机,则您被卡住了;谁实现了你的 std::bitset
(或支持它的任何数据结构,例如 std::array
),即使在 64 位系统上也将它限制为 0x7fffffff
字节,这将限制你 std::bitset
s大约 170 亿比特或更少。您唯一的选择是为您的标准库找到一个不同的提供者,或者自己重新实现它。
更新: 显然你正在使用 Windows,静态数据大小的限制是 2GB(0x7fffffff 字节),even on 64 bit Windows; Windows 可移植可执行文件格式(由 .exe
和 .dll
文件使用)对每个部分使用 32 位偏移和长度,即使对于 64 位可执行文件也是如此。通过使用全局 std::bitset
s,您试图在图像中存储 25 GB 的静态数据,这是行不通的。将它们移动到堆栈(在 main
的主体内声明它们非 static
) 可能 如果你像你那样增加堆栈保留大小,但它是依赖那么大的堆栈仍然是一个坏主意。我建议简单地动态分配 bitset
(例如 auto mas = std::make_unique<std::bitset<100000000000>>()
),或者找到一种更好的方法来使用较小的 bitset
.