如何序列化大型集合

本文关键字:集合 大型 序列化 | 更新日期: 2023-09-27 18:31:16

我正在开发一个系统,该系统具有超过500万个项目的列表和字典,其中每个项目通常是一个具有多达90个原始属性的平面dto。 集合使用 protobuf-net 持久化到磁盘,以实现弹性和子序列处理。

不出所料,我们在处理和序列化过程中遇到了 LOH。

我们可以通过使用ConcurrentBag等在处理过程中避免LOH,但是我们在序列化时仍然会遇到问题。

目前,集合中的项被批处理成 1000 个组,并并行序列化为内存流。 每个字节数组都放置在并发队列中,以便稍后写入文件流。

虽然我理解这是想做什么,但它似乎过于复杂。 感觉protobuf本身应该有一些东西可以在不使用LOH的情况下处理大量收藏。

我希望我犯了一个小学生的错误 - 有一些设置我忽略了。 否则,我将寻求编写一个自定义二进制读取器/写入器。

我应该指出我们正在使用 4.0,希望尽快迁移到 4.5,但意识到尽管 GC 有所改进,但我们无法克服这个问题。

任何帮助表示赞赏。

如何序列化大型集合

将数据

写入磁盘,并且不使用内存流。

使用 StreamReader 读取,这样您就不必在内存中保留大量数据如果您需要同时加载所有数据以进行处理,则通过在 temprory 表中编写它们的故事在 SQL Server 中执行此操作。

内存不是存储大数据的地方。