无法初始化大型矩阵Numerical Recipes C ++

时间:2015-03-05 22:07:18

标签: c++ matrix large-data

我在C ++工作。使用Visual Studio 2008,但它只是编译成控制台应用程序(没有窗口或GUI)。该程序使用特定的优化算法(来自Numerical Recipes的dfpmin),该算法使用非常大的双精度矩阵。它使用的矩阵是一个方形矩阵,其大小与参数一致。

我在我的机器上运行了较小的实现(矩阵大约是28,000 X 28,000,占用大约6.3 GB)(8GB RAM 64位)。因为存储矩阵所需的RAM非常大,所以我使用Amazon Elastic Compute服务在矩阵较大时在具有更多RAM的虚拟机上运行它。

当矩阵大约为37,000 X 37,000(大约11 GB)时,我运行例程,64位虚拟机和60 GB RAM。然而,随着矩阵变得更大,出现问题。

当我设置矩阵大约为48,000 X 48,0000(理论上约为18 GB)并在60 GB和120 GB虚拟机上运行的问题时,例程崩溃并给我一个c0000005错误表示内存访问冲突。

现在理论上,此虚拟机上的可用RAM应足以存储此矩阵。

当我编译应用程序时,它很好。当我启动时,它很好。我相信我已经将问题的时间跟踪到这个代码中,该代码位于标题中(主例程调用在标题中定义的对象,该对象执行优化)。

优化对象声明一个大小为nXn的矩阵,其中n为48,000。

 MatDoub hessin(n,n);  // this a matrix of doubles (Numerical recipes has it's own matrix object       MatDoub)

代码在此处过去,但在尝试访问矩阵以初始化值时崩溃,如下所示。

for (int i=0;i<n;i++) {
for (Int j=0;j<n;j++) {hessin[i][j]=0.0;}
hessin[i][i]=1.0;
}

第一次访问hessin时,它会崩溃,即在hessin [0] [0]处。我也试图在声明后立即访问hessin [0] [0],结果相同。

索引似乎没有超过数组的末尾(我已经犯了十亿次错误),因为访问第一个矩阵条目[0] [0]会使其崩溃。

似乎代码允许创建对象,但是不允许访问它。我还没有找到代码停止工作的矩阵大小的确切值,因为准备数据集需要相当长的时间。

任何想法都会受到赞赏。

0 个答案:

没有答案