我有了存储在字典中是一个相当复杂的,嵌套(引用调用引用的对象向上和向下)的对象(类)项目: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数据(这需要很长时间)。
关于我应该如何处理这种情况的任何建议,想法和想法。
对于长期持久性,您可能遇到binaryformatter问题(例如,更改命名空间会很快导致问题)。对于短期存储,它可能是好的,但要小心使用内存,我不认为你可以在没有问题的32位进程中用binaryformatter序列化1Gb图。如果你认为映射到表格会给你一个阻抗问题,也许你可以考虑一个文档数据库,比如RavenDB,它将整个文档图形映射到磁盘上的JSON,并为你处理大量的性能问题? – 2012-02-21 09:01:55
这些数据库中的任何一个都可以将对象图(20个相互关联的类)解析为JSON/BSON并保存它们之间的所有引用,然后存储?这个怎么用?我的理想是我将DObject直接提供给RavenDB或MongoDB,并且序列化并存储所有内容?如果我想将DObject放到RavenDB中,步骤是什么?我是MongoDB的新手,但听了很多。 – iefpw 2012-02-21 20:43:06
RavenDB是否会直接吞下对象取决于对象的结构。 RavenDB使用JSon.NET,所以你总是可以开始尝试使用Json.NET转储根对象,并看看你得到了多少。 – 2012-02-22 10:29:41