【问题标题】:Dealing with big sized array in c programming在 c 编程中处理大数组
【发布时间】:2015-02-03 21:21:30
【问题描述】:

我正在研究非线性微分方程。 我所做的是对超过 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, &params};
    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;
}
}

【问题讨论】:

  • “程序终止”时究竟发生了什么?有任何错误信息吗?此外,您使用什么目标架构在您的系统上构建?在某些情况下,您将无法使用所有 16 Gbs 的 RAM(例如 x32 Windows)
  • 它说“段错误(核心转储)”。

标签: c arrays ode gsl nonlinear-functions


【解决方案1】:

局部变量在栈上分配;堆栈不是特别大,这意味着分配非常大的数组是一个不好的地方。您需要将 A 设为指针并动态分配它(或者更好的是,如果 C++ 是一个选项,则设为 std::vector&lt;double&gt;)。

【讨论】:

  • 堆栈通常有多大?
  • @cmidi:足够大,您不必担心它,只要您不使用它来分配大数组或编写涉及极深递归的函数。在我看来,进入“我想在堆栈上分配我的数组,所以我会调整它的大小以使其适合”的心态几乎总是一个坏主意。
  • 在这种情况下,堆栈需要是 8Mb +
  • 谢谢@Hurkyl。我假设进程堆栈大小限制应该在 /proc/pid/limits right
  • 那我应该把数组放在哪里呢?我认为除了将数组放入主函数之外别无选择?有吗?
猜你喜欢
  • 2011-05-26
  • 2010-10-31
  • 2020-03-11
  • 1970-01-01
  • 2019-01-17
  • 2017-12-02
  • 2012-03-03
  • 2010-09-12
  • 2021-08-06
相关资源
最近更新 更多