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