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

     2023-02-24     170

关键词:

【中文标题】在 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# 中,如何使用大量精美的标记将 POCO 序列化为 XML?

】在C#中,如何使用大量精美的标记将POCO序列化为XML?【英文标题】:InC#,howcanIserializeaPOCOtoXMLwithalotoffancymarkup?【发布时间】:2021-11-1500:41:55【问题描述】:要使用SOAP服务,我需要以XML格式发送消息,如下所示:<soap:Envelopexmln... 查看详情

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

】C#中内存占用最低的最快的序列化器和反序列化器?【英文标题】:FastestserializeranddeserializerwithlowestmemoryfootprintinC#?【发布时间】:2010-10-1205:21:54【问题描述】:我目前正在使用二进制格式化程序(远程处理)来序列化和反序... 查看详情

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

... 参考技术B1定义一个属性2可以用事件传递3定义全局变量4序列化存文件,随便什么时候读 查看详情

c#对象与json字符串的相互转换

程序使用.NETFramework提供的JavaScriptSerializer类进行序列化和反序列化操作,需要引用.NETFramework中的System.Web.Extensions程序集。对于直接进行DataTable类型对象的转换会出现“序列化类型为“System.Reflection.RuntimeModule”的对象时检测到循... 查看详情

在 C# 中将数据加载到 DataTable 会出现“未知 SQL 类型 - 0”错误

】在C#中将数据加载到DataTable会出现“未知SQL类型-0”错误【英文标题】:LoadingdatatoDataTableinC#gives"UnknownSQLtype-0"error【发布时间】:2018-11-2814:28:38【问题描述】:我已经成功地使用以下代码将数据从ODBC连接加载到C#DataTable... 查看详情

在 C# 中打开大量文件流的替代方法

】在C#中打开大量文件流的替代方法【英文标题】:AlternativetoopeninglargenumberoffilestreamsinC#【发布时间】:2018-07-1523:33:49【问题描述】:在Unity中,我正在制作一个项目,该项目在程序上构建一个(特别复杂的)世界,并将所有生... 查看详情

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

 数据库sql脚本:CREATEDATABASETESTDBGOUSETESTDBGOCREATETABLETAB1(NAMENVARCHAR(10),AGENVARCHAR(10),ADRESSNVARCHAR(10))deleteTAB1SELECT*FROMTAB1SELECTCOUNT(0)FROMTAB1 classProgram{staticvoidMain(str 查看详情

在 c# 中可以添加到 DataTable 的行数是不是有限制?

】在c#中可以添加到DataTable的行数是不是有限制?【英文标题】:IstherealimittothenumberofrowsthatcanbeaddedtoaDataTableinc#?在c#中可以添加到DataTable的行数是否有限制?【发布时间】:2016-01-0118:57:10【问题描述】:我正在从excel文件中获取... 查看详情

为啥在 c# 中重用数组会显着提高性能?

...:2011-03-0401:09:21【问题描述】:在我的代码中,我执行了大量任务,每个任务都需要大量内存来临时存储数据。我有大约500个任务。在每个任务开始时,我为一个数组:double[]tempDoubleArra 查看详情

grpc的理解

...在接受端,把所有http2的数据帧拼接成grpc的数据帧,再反序列化成请求的结构体。如果一次传输数据过大,在序列化和反序列化的时候,都会占用大量的cpu,不仅仅序列化,单纯的内存复制,也会占用大量cpu,而且,传输的时候... 查看详情

我们可以在 c# 中的 datatable.select 中添加参数吗

】我们可以在c#中的datatable.select中添加参数吗【英文标题】:Canweaddparameterindatatable.selectinc#【发布时间】:2013-08-3014:13:46【问题描述】:我想知道是否可以在datatable.select(expression)中添加参数。例如stringquery="Name=@Name";//dtiscommingfro... 查看详情

c#实现两个(datatable)数据合并

...字段依次赋值的代码,性能就有所下降,下列将介绍合并DataTable的几种方法主要介绍三种方案方案一【For循环+RowFilter】1dt_All.Rows.Clear 查看详情

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

...页停留一段时间后跳转到另一个网页),一段时间后内存占用很大,有200M左右,有什么办法可以解决这个问题?备注:XPSP3系统,IE6。参考技术AWebbrowser其实就是IE浏览器,占用内存并不是C#占用,而是IE6占用.这个基本上没办法,最... 查看详情

求问c#如何将json字符串转为datatable求详细解答

...newtonsoft.json这个dll吧,用这个解析json字符串 参考技术B//序列化json=Newtonsoft.Json.JsonConvert.SerializeObject(dt);//反序列化dt=Newtonsoft.Json.JsonConvert.DeserializeObject(list,typeof(DataTable))asDataTable; 查看详情

在 DataTable C# 中比较和查找行值

】在DataTableC#中比较和查找行值【英文标题】:ComparingandFindingrowvalueinDataTableC#【发布时间】:2020-12-0507:18:31【问题描述】:我有一个用数据库表(两列)id和class填充的DataTable。我想将class列的值与string进行比较,并找到对应的id... 查看详情

Winforms C#:从远程计算机文件夹获取图像并加载到 DataTable 的列中

】WinformsC#:从远程计算机文件夹获取图像并加载到DataTable的列中【英文标题】:WinformsC#:GetimagefromremotecomputerfolderandloadintoDataTable\'scolumn【发布时间】:2017-12-2119:40:21【问题描述】:我有一台远程计算机,它在一个文件夹中存储... 查看详情

在 c# 中使用 Open Xml SDK 将 DataTable 导出到 Excel

】在c#中使用OpenXmlSDK将DataTable导出到Excel【英文标题】:ExportDataTabletoExcelwithOpenXmlSDKinc#【发布时间】:2012-08-0418:42:59【问题描述】:我的程序能够将一些数据和DataTable导出到Excel文件(模板)在模板中,我将数据插入到一些占位... 查看详情

在NodeJS中使用带有大量数据的Datatable时搜索错误

】在NodeJS中使用带有大量数据的Datatable时搜索错误【英文标题】:SearcherrorwhileusingDatatablewithhugedatainNodeJS【发布时间】:2018-02-1422:09:08【问题描述】:我的数据库中有大约5,00,000条记录。我正在使用DataTables构建一个管理面板来管... 查看详情