我需要尽可能快地将字典存储到文件中。密钥和值都是对象,不能保证标记为可序列化。我也更喜欢一种比序列化数千个对象更快的方法。因此,我研究了.NET 4中的映射的内存文件支持,但是,似乎MonemyMappedViewAccessor仅允许存储结构而不允许参考类型。

是否有一种方法可以存储文件的参考类型使用的内存并从该内存的斑点(无二进制序列化)中重建对象?

有帮助吗?

解决方案

内存映射的文件从根本上与垃圾收集器不兼容。这就是为什么这样的主要操作系统功能花了这么长时间才能得到.NET支持的原因。参考类型需要序列化与MMF视图,MemoryMappedViewStream,否则就无法解决。在非管理的代码中存在类似的限制,需要将带有指针的对象扁平化,以便在视图中可以看到尖头对象。

无论您将它们序列化为MMF还是将文件序列化都不会有任何区别,也可以使用MMF实现文件系统缓存。文件写入 非常 快速,只要书面数据适合可用的可映射内存。如果这是一个问题,请查看一个64位操作系统来解决该问题。

其他提示

我认为,存储存储器的斑点简直是不可行的,因为该内存(如果具有参考类型)将对其他内存块有指示,而下次访问文件时可能不会应用。这就是为什么存在二元序列化的原因:维持这类参考。但是,如果您真的想要严格的控制,我将使用system.io.io.binarywriter和binarleReader对准确的序列中写入的内容完全控制,同时最小化开销。

这是二进制序列化设计的场景。您不想使用它的特定原因吗?您是否验证了它“太慢”?当然,您可以编码自己的自定义序列化器,并可能使其在特定方案中更有效,但是您必须维护它。值得付出努力吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top