我们的代码如下:
ms = New IO.MemoryStream
bin = New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
bin.Serialize(ms, largeGraphOfObjects)
dataToSaveToDatabase = ms.ToArray()
// put dataToSaveToDatabase in a Sql server BLOB
Run Code Online (Sandbox Code Playgroud)
但是内存蒸汽从大内存堆中分配了一个大缓冲区,这给我们带来了麻烦.那么我们如何在不需要足够的可用内存来保存序列化对象的情况下流式传输数据.
我正在寻找一种从SQL服务器获取Stream的方法,然后可以将其传递给bin.Serialize(),以避免将所有数据保存在我的进程内存中.
同样,为了阅读数据...
更多背景.
这是一个复杂的数字处理系统的一部分,它可以近乎实时地处理数据,寻找设备问题等,进行序列化以便在数据馈送等数据质量出现问题时重新启动(我们存储数据源)并且可以在运算符编辑出错误值后重新运行它们.)
因此,我们更频繁地序列化对象,然后我们对它们进行反序列化.
我们正在序列化的对象包括非常大的数组,这些数组主要是双精度数以及许多小的"更正常"的对象.我们正在推动32位系统的内存限制,并使车库收集器非常努力.(系统中的其他地方正在进行改进,例如重用大型数组而不是创建新数组.)
通常,状态的序列化是追踪内存异常的最后一根 ; 我们的峰值内存使用量是在进行此序列化时.
我认为当我们反序列化对象时会得到大的内存池碎片,我预计在给定数组大小的情况下,还存在大内存池碎片的其他问题.(这还没有被调查过,因为首先看过这个的人是数字处理专家,而不是内存管理专家.)
客户是否使用Sql Server 2000,2005和2008的混合,如果可能的话,我们宁愿不为每个版本的Sql Server使用不同的代码路径.
我们可以一次拥有许多活动模型(在不同的过程中,在许多机器上),每个模型可以有许多已保存的状态.因此,保存的状态存储在数据库blob中,而不是文件中.
由于保存状态的传播很重要,我宁愿不将对象序列化为文件,然后一次将文件放在BLOB中.
我问过的其他相关问题