在C ++中,在计算机群集上分配和取消分配非常大的数组的最佳方法是什么?

问题描述

为什么以下代码会产生错误,我该如何解决?我已经为此工作了2天,因此,我将不胜感激。基本上,我不知道如何在节点上具有200 GB内存的计算机群集上分配和取消分配非常大的阵列。最佳做法是什么?谢谢!

const unsigned long int array_size_1 = 4032758016;
const unsigned long int array_size_2 = 2800526400;
const unsigned long int array_size_3 = 2800526400;
complex<double>* kinetic;
complex<double>* potential;
lapack_complex_double* hamiltonian;

int main (int argc,char *argv[]) {


    kinetic = new complex<double>[4032758016];
    potential = new complex<double>[4032758016];
    hamiltonian = new lapack_complex_double[4032758016];

    delete[] kinetic;
    delete[] potential;
    delete[] hamiltonian;
}

代码会编译。但是在运行时... 错误

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted

解决方法

我不认为您实际上需要这种大小的连续数组。解决方案是std::deque:这看起来与std::vector非常相似,但是元素存储在块中。随机访问是恒定的,push_back比向量的访问速度还要快。

此容器有两个主要用途:每当您需要在两侧都具有推/弹出操作的队列时,以及用于存储极大的缓冲区时。

代码如下:

#include <deque>

const unsigned long int array_size_1 = 4032758016;
const unsigned long int array_size_2 = 2800526400;
const unsigned long int array_size_3 = 2800526400;
std::deque<complex<double>> kinetic;
std::deque<complex<double>> potential;
std::deque<lapack_complex_double> hamiltonian;

int main (int argc,char *argv[]) {
    kinetic.resize(array_size_1);
    potential.resize(array_size_2);
    hamiltonian.resize(array_size_3);
}