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