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

从大型二进制文件反序列化对象的最快方法

  •  3
  • Homde  · 技术社区  · 15 年前

    因此,场景如下:我有一个2-3 gb的二进制序列化对象的大文件,还有一个索引文件,其中包含每个对象的id及其在文件中的偏移量。

    我需要编写一个方法,给定一组id将它们反序列化到内存中。性能是最重要的基准,其次是保持内存需求的合理。

    使用MemoryMappedFile似乎是一种方法,但是我有点不确定如何处理这个大文件。我无法为整个文件创建MemoryMappedViewAccessor,因为它太大了。我能同时打开几个不同片段的MemoryMappedViewAccessor而不影响内存吗?在这种情况下,这些片段应该有多大?

    如果数据经常被访问,然后被处理掉,那么视图可能会保存在内存中一段时间

    一个可能很简单的方法是命令按偏移量获取对象,并用一个小缓冲区为每个偏移量调用CreateViewAccessor。另一个办法是设法找出所需的最少的不同备忘录附件及其大小。。但我不确定创建CreateViewAccessor的开销以及一次可以安全访问多少空间。我可以做一些测试,但如果有人有更好的主意。。。:)

    我想另一种方法是将大数据文件分成几个文件,但我不确定这样做是否有好处。。。

    2 回复  |  直到 15 年前
        1
  •  0
  •   CodesInChaos    15 年前

    文件在什么样的存储器上?普通硬盘还是固态硬盘?如果是普通hdd,则应尽量减少寻道时间,因此可能需要按偏移量排序访问。

    我认为拥有大型内存映射段不需要太多内存。它们只占用地址空间,因为它们可以由文件本身支持。因此,使用最多的RAM是OS缓存。

    从我听到的异步IO使用 I/O Completion Ports 是最快的,但我自己还没用过。

        2
  •  0
  •   Romain Hippeau    15 年前

    我的问题是为什么你有2个3GB的序列化对象文件?这总是一个性能问题。
    你真的需要一次处理所有这些信息吗?最好的方法可能是使用某种数据库,在需要时查询所需的元素并在此时重建它们。 你能提供更多关于你在存储什么样的数据以及如何使用它的信息吗。在我看来,你的设计需要一点工作。

    推荐文章