在 C# 中序列化 DataTable 会占用大量内存 - 如何改进这一点

Posted

技术标签:

【中文标题】在 C# 中序列化 DataTable 会占用大量内存 - 如何改进这一点【英文标题】:Serializing DataTable in C# uses a lot of memory - how to improve this 【发布时间】:2016-03-23 22:49:27 【问题描述】:

常规 我有一些类似于数据库请求的代理。将结果发送回客户端时,发送的数据变得非常大 - 我需要改进这一点,否则我可能会耗尽内存并且整个应用程序将崩溃。

这就是我的工作 - 客户端调用服务器 - 服务器执行请求并从 mysql 数据库中获取数据到DataTable - 接下来我通过BinaryFormatter序列化DataTable - 生成的字节流通过 TCP 套接字发送回客户端

问题 现在发送的序列化数据(和内存使用)非常高,特别是当涉及到要发送的列和行负载的表时。这可能加起来有几百兆字节。

据我所知,XML-Data 的大量开销被序列化为我通过 TCP 连接发送的数据。

我的问题 有没有办法减少要发送的数据,比如使用将被序列化的不同对象、使用不同的方法来序列化数据或其他任何有助于减少内存使用的方法?

【问题讨论】:

【参考方案1】:

你可以做几件事。

1.) 通过删除任何不必要的列来减小数据表的大小。

2.) 您可以尝试使用不同的对象,例如通用 List<T>,因为 DataTable 有很多关于它的信息。

3.) 更改架构,不将整个数据发回,而是执行分页 - 请参阅 https://bytes.com/topic/asp-net/answers/341151-ado-net-sql-server-data-paging 了解如何执行分页

【讨论】:

感谢您的建议。我将尝试建议 2) 和 3) 并让您知道结果。 1) 只会将问题转发到发送较长表格的情况。 3) 也退出选项,因为数据需要稍后整体处理。我可能仍会尝试将 DataTable 放入另一个对象并序列化该对象。我们会看看这是否有帮助。 或多或少我尝试了一些避免内存问题的方法。我获取 DataTable,然后将其序列化并逐行发送(或 20 行左右的块)。在客户端,我重新聚合所有内容,并能够发送整个 DataTable 而无需一次需要太多内存。这不完全是您的答案,但受到您对分页的想法的启发,所以无论如何我都会接受您的答案。 谢谢 - 分页是根据您的上下文进行的,但做得很好!

以上是关于在 C# 中序列化 DataTable 会占用大量内存 - 如何改进这一点的主要内容,如果未能解决你的问题,请参考以下文章

C#管理大量耗时的线程,内存占用严重

C# 通过DataTable插入大量数据,50万数据只需要3秒

C# 对象与 JSON 字符串的相互转换

C# 在一次事件中获取的DATATABLE怎么让全局共享?

C# 中内存占用最低的最快的序列化器和反序列化器?

C#编写的程序 使用Webbrowser控件,占用大量内存?