c# - 如何序列化一个大集合

标签 c# serialization protobuf-net large-object-heap

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

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

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

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

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

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

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

感谢任何帮助。

最佳答案

将数据写入磁盘,不使用内存流。

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

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

关于c# - 如何序列化一个大集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18788368/

相关文章:

c# - 仅引用 csvhelper 中的字符串

c# - 如何在打开的 xml 上摆脱我的 "After Spacing"

C# HttpWebRequest - 转义 POST 内容?

c# - 在运行时更改 C# 中字段的类型

.net - 如何在 protobuf-net 中启用字符串实习?

protocol-buffers - Windows C++ .Net 下的 Protocol Buffers

c# - SSIS 2012 : is it possible to pass references to Package Objects to an external assembly?

Java 序列化产生 NotSerializedException(原因未知)

c# - Protobuf-net 有教程吗?

javascript - 如何将 touchevent 字符串化,忽略任何 DOM 引用?