2011-10-25 41 views
2

我嘗試在模塊中定義一個函數,然後使用DumpSave將函數定義保存到文件中。但是,重新加載功能失敗。這裏有一個小例子如何轉儲保存一個函數?

buildf[]:= Module[{res}, 
    res[x_]:=x^2; 
    res 
]; 
f=buildf[]; 
DumpSave["f.mx", f]; 
Clear[f]; 
Get["f.mx"] 

現在我希望f是方形的功能,但它仍然是Clear語句後不確定。我該如何解決這個問題?

幾個月前,這個問題與my earlier question密切相關,但是那裏的解決方案並沒有幫助我。

任何暗示讚賞!

更新buildf正在讀幾個數據文件,將它們轉換,定義基於這些規則,並調用調度,使查找快。然後由buildf返回的函數就像數據的API。我想避免調用buildf,而是加載創建的數據函數的二進制轉儲。

Save方法似乎很有前途,但它仍然無法正常工作。我會嘗試隔離問題,以便在此處重現。

最後更新 後@Leonid的局部變量的唯一性無法跨會話保證的評論,我決定使用僅依賴於其他符號普通的數據結構,而不是功能這個「DumpSave緩存機制」。

回答

3

您正在從Module返回本地變量(res)。當然,這是行不通的,你最終會得到一個「本地化」(更名)的res版本。

嘗試

f = buildf[] 
?f 

,你會得到這樣的f=res$538。此局部變量具有屬性Temporary,並且可以隨時刪除(因此f可以停止工作)。

如果DumpSave符號f,其作爲f=res$538定義將被保存,並且可以重新加載(你可以用?f驗證)。但是這不是很有用。

這裏的問題是:你爲什麼要用這個buildf函數呢?你想達到什麼目的?

編輯:作爲獅子座下面指出的那樣,我上面寫的是不是完全正確的:與DownValue S中的符號從Module返回似乎並沒有得到清除,即使他們沒有被引用。有人可能會懷疑這種行爲在版本之間是否一致,並且將來會一致。

+0

你說:「這個局部變量具有Temporary屬性,可以在任何時候被刪除(因此f可以停止工作)。」你能證明這是真的嗎? * Mathematica *實際上是垃圾收集這樣的東西? –

+0

@ Mr.Wizard不,我現在不能,我從文檔中獲得:「臨時屬性的符號在不再需要時會自動刪除。」我對這個答案也很感興趣,但現在是我的就寢時間。我會明天檢查:-) – Szabolcs

+0

好的。我認爲關鍵是「不再需要」的意思。 –

3

如果您使用Save代替DumpSave,您可以看到發生了什麼。

我得到類似如下的文件:

f = res$636 

Attributes[res$636] = {Temporary} 

res$636[x_] := x^2 

這(Save而不是DumpSave)實際工作,但我建議Temporary屬性導致此丟失,或不保存在首位,當使用DumpSave


我必須拒絕我斷言上面,我可以手動從res$*符號清除Temporary屬性,它仍然無法保存和加載。

+0

+1表示'(轉儲)保存'也保存了函數的「依賴關係」(即在保存的函數定義中使用的符號的定義)。 – Szabolcs

+1

確實'Save'確實創建了一個更完整的mx文件,但是在實際使用情況下,重新加載的函數不起作用。我在問題中添加了更多關於該問題的信息。 –

2

這顯然比我第一次想到的更基本。由於創建了與系統相關的二進制格式,我自己很少使用DumpSave,我認爲它的行爲非常類似於Save。但是,這似乎並非如此。

考慮:

test[x_] := x^2 
f = test; 
DumpSave["test.mx", f] 
Quit[] 

其次:

Get["test.mx"] 
Information[f] 
Information[test] 

在我的系統,用於test沒有定義保存和/或加載。

對比搭配:

Get["test2.m"] 
Information[f2] 
Information[test2] 

test2定義正確保存和載入:

test2[x_] := x^2 
f2 = test2; 
Save["test2.m", f2] 
Quit[] 

被緊隨其後。

+2

也許不同之處在於'Save'根據文檔使用'FullDefinition','DumpSave'則不是。 –

相關問題