2015-03-02 37 views
2

編譯後,我遇到了Scilab中的內存分配問題。Scilab編譯「無法分配此數量的內存」

我在ppc64(POWER8)上的紅帽上編譯。堆棧限制已被設置爲無限制(ulimit -s unlimited)。 ./configure腳本(有幾個選項我沒有在這裏顯示)成功運行,但make all失敗並停止。當它停了,還停留在Scilab的命令提示符下此消息:

./bin/scilab-cli -ns -noatomsautoload -f modules/functions/scripts/buildmacros/buildmacros.sce 
stacksize(5000000); 
        !--error 10001 
stacksize: Cannot allocate memory. 
%s: Cannot allocate this quantity of memory. 

at line  27 of exec file called by : 
exec('modules/functions/scripts/buildmacros/buildmacros.sce',-1) 

--> 

我已經調查了一下,該錯誤消息似乎在行00027buildmatros.sce叫,當然,這裏的功能stacksize(5000000)是調用。

這個函數中定義:

scilab-5.5.1/modules/core/sci_gateway/c/sci_stacksize.c 

我發現了一個版本的文件在這個頁面:http://doxygen.scilab.org/master_wg/d5/dfb/sci__stacksize_8c_source.html。 條件是假的,並觸發這個事件在我看來,在線路00295.

顯示了在這個文件中,你看到的是顯示的錯誤,每當作爲輸入的stacksize是比什麼是該方法返回LARGER get_max_memory_for_scilab_stack()從類:

scilab-5.5.1/modules/core/src/c/stackinfo.c 

我再次下頁發現了一個版本的在線: http://doxygen.scilab.org/master_wg/dd/dfb/stackinfo_8h.html#afbd65a57df45bed9445a7393a4558395 該方法是從線109聲明。

它似乎會調用一個名爲MAXLONG的變量,但該變量從未明確聲明!如您所見,已多次聲明(行0001900035,00043,00050),但所有行均已註釋! [校正:線路沒有評論,這是我的#是註釋符號的錯誤的認識,但它並不是]

所以我的猜測是:MAXLONG未聲明的,所以功能不返回值(或返回0),因此錯誤消息被觸發,因爲輸入的stacksize高於0或NULLN/A

我的問題是,那麼:

  • 爲什麼都行作了評論MAXLONG定義?
  • MAXLONG起源於哪裏?它是從內核傳遞的東西嗎?
  • 我該如何解決問題?

謝謝!

PS - 我試圖取消註釋buildmacros中的行,並且它沒有問題地編譯和安裝。但是,當我開始scilab-cli時,它再次顯示相同的消息。經進一步調查後


編輯:

經過進一步調查,我發現了我認爲是的評論的確是編譯器指令......但我一直在我的這些錯誤,從而使回答我的問題是可以理解的。

這是我的新觀點。

在Scilab中,我注意到通過給出一個輸入堆棧大小超出界限,調用相同的方法get_max_memory_for_scilab_stack()來獲得上限。我看到它的下界是默認定義的。

-->stacksize(1) 
      !--error 1504 
stacksize: Out of bounds value. Not in [180000,268435454]. 

還用堆棧大小似乎罰款:

-->stacksize() 
ans = 

    7999994. 332. 

但是,試圖給這種值的輸入其間時,它失敗。

-->stacksize(1) 
      !--error 1504 
stacksize: Out of bounds value. Not in [180000,268435454]. 
+0

它定義在:'stackinfo.c line 00035 #define MAXLONG LONG_MAX',它應該是2 GB,所以max應該是2GB/8或256M。 – 2015-03-02 12:59:46

回答

1

這似乎調用了一個名爲MAXLONG

變量,它不是一個變量,而是一個預處理器宏。

爲什麼所有行都評論了MAXLONG的定義?

您應該從評論該行的人那裏詢問。他們是不是評論了scilab-5.5.1這就是online

MAXLONG來自哪裏?它是從內核傳遞的東西嗎?

它在文件scilab-5.5.1/modules/core/src/c/stackinfo.c中定義。它的定義與LONG_MAX相同,由標準c庫(<limits.h>標頭)定義。如果該宏不是由標準庫提供的,那麼它就被定義爲某個其他平臺特定的值。

我該如何解決問題?

如果您的問題源於缺少MAXLONG的定義,那麼您必須對其進行定義。解決這個問題的方法之一是取消註釋定義它的行。或者重新下載原始資料,因爲您的資料看起來不符合官方資料。

+0

非常感謝您的答覆!我的糟糕之處在於,我認爲所有那些「#」意味着這些行被評論,但實際上不是,這不是評論標記,它們是編譯器的實際輸入。我確實有原始資源,所以我會在'limits.h'和其他宏中進一步研究。 – Andrea 2015-03-02 13:37:25

+0

如果我運行搜索limits.h庫,我發現很多(一個是與先進的Tolchain,ppc64平臺的一組特定的編譯器庫)。我怎樣才能得到編譯器在編譯過程中採用哪個庫? – Andrea 2015-03-02 14:17:22

+0

那麼,你可以嘗試在文件中逐個添加'#error'指令,直到你的程序停止編譯。另一方面,標準頭文件不保證在文件中,所以可能沒有找到你使用的文件。 – user2079303 2015-03-02 14:27:30