2013-08-30 150 views
1

成功实现karatsuba算法后,我决定比较学校算法所需的时间。该程序需要测试多达32768位数字。不幸的是,它停止在8192位(数字存储在一个数组中)。当用gdb运行时,我得到输出:Programme terminated with SIGKILL, Killed。很显然,我通过网络搜索并发现(因为我在Linux上),内核自动杀死该程序,因为它消耗了太多的资源。 所以我的问题是:有没有办法让它继续运行?保持c程序运行

在此先感谢您的任何回应

+4

'ulimits'也许? –

+5

使用更少的资源,一个32768整型数组('128KB')并不那么大。我猜你可能有内存泄漏,吞噬系统资源。使用** [valgrind](http://valgrind.org/)**检查内存泄漏! –

+0

谢谢,我会检查 – BigFoot

回答

1

最可能的原因是内存耗尽。您可以通过在终端上运行top来粗略测试此假设。

如果是这样的话,valgrind是你的朋友。仔细查看你的程序中每个你呼叫malloc的地方,并确保你在之后为每个数组调用free

+0

谢谢你的回应,但由于karatsuba算法是递归的,我使用指针,似乎很难释放所有分配的内存。所以我会用普通变量来尝试。 – BigFoot

0

在强制Linux让你的程序继续运行之前,我看到了许多你应该做的事情(如果你可以这样做的话)。

  1. 当心内存泄漏(见jons34yp的答案)
  2. 一旦所有的内存泄漏解决,请检查您 变量的声明,每一个非使用位,但分配的位是一对多的。如果一个 字节就足够了(无符号字符),不要使用短小的字符。如果短裤是 就够了,不要用久了。浮法和双打也是如此。还检查 最终结构和工会未使用的数据。
  3. 同时检查你的算法和你实现它的方式。例如稀疏矩阵可以用其他方式来表示,而不是用整个 数组来表示。
  4. 请记住,C编译器用来对齐数据字段。这意味着 例如,在一个13字节的数组之后,编译器倾向于将 对齐32位或64位边界上的下一个字节,而使用 之间的未使用字节。结构中可能发生同样的事情。 因此请检查您的编译器对齐设置。

我希望这有助于找到解决方案。

亲切的问候, PB