Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::bad_alloc:在Eigen中确定缓冲区大小_C++_Size_Buffer_Eigen_Bad Alloc - Fatal编程技术网

C++ std::bad_alloc:在Eigen中确定缓冲区大小

C++ std::bad_alloc:在Eigen中确定缓冲区大小,c++,size,buffer,eigen,bad-alloc,C++,Size,Buffer,Eigen,Bad Alloc,我使用Eigen矩阵格式读取先前获取的多维数据: Eigen::Matrix<unsigned long long, Eigen::Dynamic, 12> dummyData; PackSize的顺序可以是6e08。为了避免计算缓冲区大小时出现整数溢出,我在win32上使用了unsigend long long来寻址(PackSize*12*8)mod(2^32)。然而,我提出了:未处理的异常在DATAARAD.EXE 0x75 362F7:微软C++异常:STD::BADYOL

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

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

PackSize
的顺序可以是
6e08
。为了避免计算缓冲区大小时出现整数溢出,我在win32上使用了
unsigend long long
来寻址
(PackSize*12*8)mod(2^32)
。然而,我提出了:<代码>未处理的异常在DATAARAD.EXE 0x75 362F7:微软C++异常:STD::BADYOLL在内存位置0x00 4CBCF0。有人能帮我解决这个问题吗?

我不完全确定您是否希望将
无符号long-long
作为矩阵的标量类型;从数学上讲,矩阵应该在域上定义,你必须知道,如果你试图找到一个正整数的乘法逆(即,无符号整数必须与无符号整数相乘才能得到1),那么环理论对你来说并不容易

然而,这在Eigen中是合法的,所以我们将继续使用它——也许你不想对矩阵执行需要来自你的场的这些属性的操作

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


不过,最有可能的情况是,您的12列格式也被填充为更好地对齐的格式。关于这一点,Egeng文档并不太具体,我认为实际的实现取决于Egeng库是如何编译的,所以我不能很好地向您提供建议。您可以尝试使用Eigen::Matrix模板中的
DontAlign
选项。

您知道您总共需要多少内存吗?对我来说,这似乎很多,如果您的系统无法处理这一数量,您应该接收
std::bad\u alloc
。呃……您试图分配的内存大约为54 GB。这比win32中的虚拟地址空间还多。您是否考虑过使用32位而不是创建64位应用程序?@Wintermute我知道我正在分配一大块内存!事实上,我不知道有没有其他解决办法。你能告诉我如何处理这个问题吗?使用64位操作系统和超过54 GB的RAM。要将54 GB分配到一个4 GB大的地址空间(其中一半是为操作系统保留的),您实在无能为力。或者用一种需要更少内存的方式重述你的问题。既然你没有说明你的问题是什么,我就帮不了你。哦,请注意,目前大多数消费级CPU只能处理高达32 GB的数据,因此您必须使用服务器CPU(如Xeon)。11184810大约是11e6,而不是11e8。顺便说一句,如果您试图加载54 GB的数据,您可能在做一些叫“超级计算”的事情,或者您可能根本不想在RAM中这样做。这将在算法上变得复杂,但你不能坚持一个较小的问题,不是吗;P?@MarcusMüller我试图存储的是批量数据。我正在考虑将数据分成若干块读取,尽管这会使来自不同来源的数据的同步有点痛苦!
dummyData.resize(PackSize, 12);