代码之家  ›  专栏  ›  技术社区  ›  Khash

使用C中的映射内存文件存储引用类型

  •  0
  • Khash  · 技术社区  · 15 年前

    我需要尽可能快地将字典存储到文件中。键和值都是对象,不能保证标记为可序列化。另外,我更喜欢比序列化数千个对象更快的方法。所以我研究了.NET 4中的映射内存文件支持。但是,似乎memoryMappedViewAccessor只允许存储结构,而不允许存储引用类型。

    有没有一种方法可以存储文件的引用类型使用的内存,并从该内存块重建对象(不进行二进制序列化)?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Hans Passant    15 年前

    内存映射文件基本上与垃圾收集器不兼容。这就是为什么这样一个主要的操作系统功能需要这么长时间才能得到.NET的支持。引用类型需要序列化到mmf视图memoryMappedViewstream,这是无法避免的。在非托管代码中存在类似的限制,带有指针的对象需要扁平化,以便指向的对象在视图中也可见。

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

        2
  •  1
  •   BlueMonkMN    15 年前

    我认为存储一块内存是不可行的,因为如果内存具有引用类型,那么它将具有指向其他内存块的指针,这些内存块在下次访问文件时可能不会应用。这就是二进制序列化存在的原因:为了维护这些类型的引用。但是,如果您真的想要严格的控制,我将使用System.IO.BinaryWriter和BinaryReader来完全控制以何种顺序写入文件的内容,同时最小化开销。

        3
  •  0
  •   500 - Internal Server Error    15 年前

    这是为二进制序列化设计的方案类型。你不想用这个有什么特别的原因吗?你确认它“太慢”了吗?当然,您可以编写自己的自定义序列化程序代码,并可能使其更高效地用于特定的场景,但接下来您必须对其进行维护。值得付出努力吗?

    推荐文章