0

我有了存儲在字典中是一個相當複雜的,嵌套(引用調用引用的對象向上和向下)的對象(類)項目:MemoryMappedFile或序列號,速度非常大的物體上

public static Dictionary<string, Object1> DObject { get; set; } 

Object1是一個複雜的類。它不像「地址簿」或「人員信息」類。該類本身具有數組,另一個對象的字典。那些對象引用類在它之上,等等。

由於DObject的大小可以是1GB +的內存,我將使用BinaryFormatter將它序列化爲一個文件。因爲我需要加載這個對象,所以我想使用MemoryMappedFile。新的鍵和值可能會添加到字典中。對象可能有更多的數據(添加/更新)等。MMF是否更改大小?如何訪問內存映射文件中的DObject中的某個鍵?在內存中是否存在像哈希表一樣的搜索機制,以便我可以像字典那樣找到某個特定的鍵並獲取其值?無論如何,這個MMF是如何工作的?

我的理想是。在磁盤上有一個大文件(2GB +)。我在磁盤上快速更新字典中的對象,就像保存在磁盤上的內存一樣。一切都很快。鍵值一路查找。我查找,編輯值,保存等等......我必須在任何時候快速訪問這個2GB +對象。如果WCF服務器重新啓動,我需要快速訪問此2GB +大小的對象。這就是爲什麼我想1)序列化2)。加載並從/向MMF讀取。我目前主要關心的是速度。換句話說,我每次調試項目時都無法重新加載這2GB數據(這需要很長時間)。

關於我應該如何處理這種情況的任何建議,想法和想法。

+1

對於長期持久性,您可能遇到binaryformatter問題(例如,更改命名空間會很快導致問題)。對於短期存儲,它可能是好的,但要小心使用內存,我不認爲你可以在沒有問題的32位進程中用binaryformatter序列化1Gb圖。如果你認爲映射到表格會給你一個阻抗問題,也許你可以考慮一個文檔數據庫,比如RavenDB,它將整個文檔圖形映射到磁盤上的JSON,併爲你處理大量的性能問題? – 2012-02-21 09:01:55

+0

這些數據庫中的任何一個都可以將對象圖(20個相互關聯的類)解析爲JSON/BSON並保存它們之間的所有引用,然後存儲?這個怎麼用?我的理想是我將DObject直接提供給RavenDB或MongoDB,並且序列化並存儲所有內容?如果我想將DObject放到RavenDB中,步驟是什麼?我是MongoDB的新手,但聽了很多。 – iefpw 2012-02-21 20:43:06

+0

RavenDB是否會直接吞下對象取決於對象的結構。 RavenDB使用JSon.NET,所以你總是可以開始嘗試使用Json.NET轉儲根對象,並看看你得到了多少。 – 2012-02-22 10:29:41

回答

0

您不能將DObject本身保存在內存映射文件中。 .NET對象往往會一直移動,你不能強迫它們留在內存中的一個地方(你可以固定它們,但你真的不想)。您可以序列化對象並將其寫入文件,但這意味着每次寫入超過1GB的數據。

爲什麼不走標準方式,並將您的對象「序列化」到一組數據庫表中?

+0

我該怎麼做?該對象不是一個簡單的「人員信息」或「聯繫信息」列表。該對象本身具有鍵值對的字典。字典的值有「列表」,這些列表可能包含「Dictionary 」。該對象引用外部對象等。如果我在類中有一個簡單的字符串int,那麼我將它保存到數據庫表中。這個值有一對多的連接。總共有大約20個類別包含在這個字典的這個值中。 – iefpw 2012-02-21 07:16:42

+0

您可以模擬您在數據庫表中提到的所有內容。如果您有大約20個班級,則需要大約20個表格。 – zmbq 2012-02-21 07:34:08

+0

好的。我認爲它正在成爲關於序列化和數據庫存儲的爭論。我認爲這是一個有效的討論。 – iefpw 2012-02-21 08:09:33