问题描述
为什么以下代码会产生错误,我该如何解决?我已经为此工作了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);
}