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

In C++, what is the best way to allocate (and de-allocate) a very large array on a computer cluster?

为什么以下代码会产生错误,我该如何解决?我已经为此工作了 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甚至比向量的更快。

这个容器有两个主要用途:每当你需要一个在两边都有 push/pop 操作的队列时,以及为了存储非常大的缓冲区。

代码如下所示:

#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);
}