2016-04-19 37 views
2

thisthis的帖子中我描述了我想開發的框架。在不同的運行中保留對象狀態

我想實現一個memoization策略來激發一些函數的執行。

該框架的一個重要功能應該是「記住」過去運行的計算值:假設我們編寫一個程序,在該程序中執行字數計數功能f並將大文本t作爲輸入。在我們計算了r=f(t)(其中r是結果)之後,我們遵循memoization邏輯,因此我們在某處存儲(t,r),比如unordered_map對象um。之後,程序終止。

在同一節目的下一次執行中,f昂貴的執行是沒有必要的,因爲um包含已經(t,r),所以返回的值r

所有這一切的問題是如何在不同的執行過程中「記住」um狀態。

重要: 顯然,這是一個例子讓你瞭解這個框架的一個可能的應用,但任何記憶化應用程序必須正常工作。

Write a c++ object to file是該問題/場景的唯一解決方案,還是另一個?

+1

使用文件系統保存信息並在稍後的運行過程中將其讀入。 – lcs

+0

你能解釋一下你的解決方案嗎?考慮重要部分,不要過分關注所提供的示例(只是爲了理解這種記憶而報告)。 – justHelloWorld

+0

那麼你將不得不在某處存儲數據。您可以使用數據庫,文件,某種雲存儲或其他類型的數據,但數據將不得不存儲在持久存儲位置。 – NathanOliver

回答

1

數據必須存儲在進程外的某個位置,以便在進程終止後保留它。文件系統是存儲數據的顯而易見的地方,但也可以由另一個進程(如數據庫管理系統或外部高速緩存(例如https://memcached.org/))存儲。

大多數後端選項將數據存儲爲字符流。您將需要了解如何(de)serialize的數據。

1

旁註:你可以讓程序繼續運行嗎?那麼你不需要在磁盤上存儲備忘錄。

無論您存儲的備忘錄:

如果這是真的話,伯爵也忘記憶化:您將需要閱讀全文,以瞭解它是否等同於以前的文本。然後你就可以在飛行中統計這些文字。

如果不是字數統計,這只是一個更復雜的計算的例子:而不是存儲text -> computed-value備忘錄,您可以存儲hash -> computed-value備忘錄。您根據自己的情況選擇散列:如果您需要確定它是相同的文本,則可以使用例如SHA-1。如果你需要一個非常便宜的「散列」(例如,當存儲的計算值僅用作初始猜測,無論如何都會改進),那麼你可以使用文本字符串中的字節數作爲「散列」。