2011-10-13 40 views
-1

我有以下代碼:紅寶石與電子表格被陷在異常

require 'spreadsheet' 

class MyObject 
    def initialize 
    @workbook = Spreadsheet::open('foo.xls', 'r') 
    end 
end 

h = MyObject.new 
h.inexistent 

運行它,紅寶石(1.9.2p290 [I386-的mingw32])將打印「test.rb:10:in '<main>'」,然後開始連續吃起來RAM直到它被殺死。

顯然,這是異常消息「test.rb:10:in '<main>': undefined method 'inexistent' for #<MyObject:0xfb5140> (NoMethodError)」的開始。

如果沒有拋出異常,程序將正常終止。

什麼可能導致這種奇怪的行爲?

請注意,inexistent不存在。這是有意爲了演示拋出異常時的行爲。

+0

您使用的是什麼版本的電子表格寶石? xls文件有多大,是由gem還是通過Excel創建的?你能否成功加載文件並直接在irb中使用電子表格查看它? – Khronos

+0

@Kronos:它是0.6.5.9(最近的一個)。 XLS體積小巧,使用Excel創建。我可以成功加載並讀取Ruby(腳本或irb) - 只要沒有引發異常。 –

回答

1

這僅僅是一個在黑暗中拍攝:

我相信答案您的問題是,當異常被拋出的電子表格對象被轉換成它的字符串表示,這使得即使是很小的電子表格拿暫時增加大量內存。

我無法複製您不斷增長的內存,但在我的情況下,即使使用22k電子表格,我也能通過檢查電子表格對象使irb消耗大約140 meg的內存。

一個簡單的測試方法是爲MyObject添加一個自定義的to_s方法,以避免電子表格轉儲。

class MyObject 
    def initialize 
    @workbook = Spreadsheet::open('foo.xls', 'r') 
    end 
    def to_s 
    "Put something more useful here" 
    end 
end 
+0

好槍 - 就是這樣。非常感謝。 –