MemoryMappedFile或序列化,速度非常大的对象

时间:2012-02-21 06:43:32

标签: c# serialization deserialization memory-mapped-files memory-mapping

我有一个项目,它有一个相当复杂的嵌套(引用调用上下引用的对象)对象(类)存储在字典中,如:

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 个答案:

答案 0 :(得分:0)

您无法将DObject本身保留在内存映射文件中。 .NET对象往往会一直移动,你不能强迫它们留在内存中的某个位置(你可以固定它们,但你真的不想这样做)。您可以序列化对象并将其写入文件,但这意味着每次写入超过1GB的数据。

为什么不采用标准方式,并将对象“序列化”为一组数据库表?