1

我使用 Eigen 的矩阵格式来读取之前获取的多维数据:

Eigen::Matrix<unsigned long long, Eigen::Dynamic, 12> dummyData;

后来知道我的数据大小后:

dummyData.resize(PackSize, 12);

PackSize可能是6e08. 为了避免在计算缓冲区大小时整数溢出,我unsigend long long以前可以(PackSize* 12*8) mod (2^32)在 win32 上寻址。然而,我想出了:Unhandled exception at 0x75362F71 in DataRead.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x004CBCF0。有人可以帮我解决这个问题吗?

4

1 回答 1

1

我不完全确定您是否希望拥有unsigned long long矩阵的标量类型;从数学上讲,应该在字段上定义矩阵,并且您必须知道,如果您尝试找到正整数的乘法逆元(即,您必须将无符号整数与无符号整数相乘),环理论对您来说并不容易整数与得到 1)。

然而,这在 Eigen 中是合法的,所以我们会坚持下去——也许你不想对矩阵进行需要你的领域的这些属性的操作。

因此,您说的是您使用的是 win32(即 windows API),但实际上并不是您的操作系统是 32 位还是 64 位。如果您正在运行 32 位 Windows,则任何进程都不能拥有超过 2GB 的虚拟地址空间,并且分配超过 2GB/sizeof(long long) unsigned long longs 将不起作用。现在,long long 是 64bit=8Byte,所以每 2GB 可以拥有的 uint64_t 的最大数量是 134217728;现在,您希望将它们分成 12 列的行,最多保留 11,184,810 行(忽略您的数字不是进程内存中唯一的事实)。现在,11e6 < 6e8,您必须考虑到您不知道 Eigen 尝试使用哪种类型的分配器,这实际上可能会尝试分配比立即需要的更多的分配器。

不过,最有可能的是,您的 12 列格式也被填充到更好对齐的东西上。Eigen 文档对此并不太具体,我认为实际实现取决于您的 Eigen 库是如何编译的,所以我通常不能很好地建议您。您可以尝试使用DontAlignEigen::Matrix 模板中的选项。

于 2015-01-09T15:34:21.590 回答