在 C 编程中处理大型数组
Dealing with big sized array in c programming
我正在研究非线性微分方程。
我所做的是对超过 100 个不同初始条件值的位置进行平均。
我在gsl中使用了odeiv。对于每个初始值,时间范围是 4*10^7。然而,一旦我设置了 10 个不同的初始条件和 10^6 的时间范围,程序就死机了。这是一种限制。
我的电脑是8核16GB内存。我不认为这是那么大。
我会放一部分编码。有人帮我吗?
谢谢。
long long int i, j, k;
double const y_i = 0, dydt_i = 0;
double n = 10;
long long int tmax = 1000000;
double A[tmax];
for (j=0; j < n; j++)
{
double y_j = y_i + 0.001*j;
double dydt_j = dydt_i;
t = 0.0;
double y[2] = {y_j, dydt_j};
gsl_odeiv2_system sys = {func, jac, 2, ¶ms};
gsl_odeiv2_driver * d = gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rk8pd, 1e-6, 1e-6, 0.0);
for (i=0; i< tmax; i++)
{
double ti = (double) i;
int status = gsl_odeiv2_driver_apply (d, &t, ti, y);
if (status != GSL_SUCCESS)
{
printf("error, return value%d\n", status);
break;
}
A[i] = A[i] +y[0];
}
gsl_odeiv2_driver_free (d);
}
for (k=0; k < tmax; k++)
{
A[k] = A[k]/n;
printf("%lld %e\n", k, A[k]);
}
return 0;
}
}
局部变量分配在栈上;堆栈不是特别大,这意味着它不是分配非常大的数组的好地方。您需要使 A
成为一个指针并动态分配它(或者更好的是,如果 C++ 是一个选项,则使它成为 std::vector<double>
)。
我正在研究非线性微分方程。 我所做的是对超过 100 个不同初始条件值的位置进行平均。
我在gsl中使用了odeiv。对于每个初始值,时间范围是 4*10^7。然而,一旦我设置了 10 个不同的初始条件和 10^6 的时间范围,程序就死机了。这是一种限制。
我的电脑是8核16GB内存。我不认为这是那么大。
我会放一部分编码。有人帮我吗? 谢谢。
long long int i, j, k;
double const y_i = 0, dydt_i = 0;
double n = 10;
long long int tmax = 1000000;
double A[tmax];
for (j=0; j < n; j++)
{
double y_j = y_i + 0.001*j;
double dydt_j = dydt_i;
t = 0.0;
double y[2] = {y_j, dydt_j};
gsl_odeiv2_system sys = {func, jac, 2, ¶ms};
gsl_odeiv2_driver * d = gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rk8pd, 1e-6, 1e-6, 0.0);
for (i=0; i< tmax; i++)
{
double ti = (double) i;
int status = gsl_odeiv2_driver_apply (d, &t, ti, y);
if (status != GSL_SUCCESS)
{
printf("error, return value%d\n", status);
break;
}
A[i] = A[i] +y[0];
}
gsl_odeiv2_driver_free (d);
}
for (k=0; k < tmax; k++)
{
A[k] = A[k]/n;
printf("%lld %e\n", k, A[k]);
}
return 0;
}
}
局部变量分配在栈上;堆栈不是特别大,这意味着它不是分配非常大的数组的好地方。您需要使 A
成为一个指针并动态分配它(或者更好的是,如果 C++ 是一个选项,则使它成为 std::vector<double>
)。