gpt4 book ai didi

c# - 提高 DataTable.ReadXml 性能

转载 作者:太空宇宙 更新时间:2023-11-03 11:32:24 27 4
gpt4 key购买 nike

我正在使用 DataTable.WriteXml() 方法将 DataTable 写入 xml。这需要几秒钟,我认为这非常好。

但是,使用 ReadXml() 方法读取文件(38MB 大小,26000 行,36 列)需要 3 分钟!我已经在调用 ReadXml 之前使用了 DataTable.BeginLoadData() 方法(这使它快了约 10 秒),但是我还能做些什么来提高性能吗?

加载方法如下:

            data = new DataTable();
data.BeginLoadData();
data.ReadXml(filedialog.FileName);
data.EndLoadData();

我已经使用断点和秒表看到它实际上是耗时部分的 ReadXml 方法。

这是 XML 方案:

<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="ReportTable" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="ReportTable">
<xs:complexType>
<xs:sequence>
<xs:element name="Task" type="xs:int" minOccurs="0" />
<xs:element name="Project" type="xs:string" minOccurs="0" />
<xs:element name="DP" type="xs:string" minOccurs="0" />
<xs:element name="Requester" type="xs:string" minOccurs="0" />
<xs:element name="TaskType" type="xs:string" minOccurs="0" />
<xs:element name="OriginalMethod" type="xs:string" minOccurs="0" />
<xs:element name="Method" type="xs:string" minOccurs="0" />
<xs:element name="Country" type="xs:string" minOccurs="0" />
<xs:element name="DayPosted" type="xs:string" minOccurs="0" />
<xs:element name="DayFinished" type="xs:string" minOccurs="0" />
<xs:element name="Posted" type="xs:dateTime" minOccurs="0" />
<xs:element name="JustifiedPosted" type="xs:dateTime" minOccurs="0" />
<xs:element name="Due" type="xs:dateTime" minOccurs="0" />
<xs:element name="DueInSec" type="xs:double" minOccurs="0" />
<xs:element name="AvailableDPWorkTime" type="xs:double" minOccurs="0" />
<xs:element name="AvailableWorkHours" type="xs:string" minOccurs="0" />
<xs:element name="StartedDate" type="xs:dateTime" minOccurs="0" />
<xs:element name="FinishDate" type="xs:dateTime" minOccurs="0" />
<xs:element name="SecUsed" type="xs:double" minOccurs="0" />
<xs:element name="MinsUsed" type="xs:double" minOccurs="0" />
<xs:element name="HoursUsed" type="xs:double" minOccurs="0" />
<xs:element name="TimeUsed" type="xs:string" minOccurs="0" />
<xs:element name="Month" type="xs:string" minOccurs="0" />
<xs:element name="Experience" type="xs:int" minOccurs="0" />
<xs:element name="Delay" type="xs:string" minOccurs="0" />
<xs:element name="SecDelay" type="xs:int" minOccurs="0" />
<xs:element name="TimeDelayed" type="xs:string" minOccurs="0" />
<xs:element name="PostedVsDue" type="xs:string" minOccurs="0" />
<xs:element name="Modified" type="xs:dateTime" minOccurs="0" />
<xs:element name="AvailableDPModWorkTime" type="xs:double" minOccurs="0" />
<xs:element name="ModifiedAvailableWorkHours" type="xs:string" minOccurs="0" />
<xs:element name="MasterProject" type="xs:string" minOccurs="0" />
<xs:element name="Year" type="xs:string" minOccurs="0" />
<xs:element name="Department" type="xs:string" minOccurs="0" />
<xs:element name="Customer" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>

最佳答案

我很久以前遇到过同样的问题,通过将 EnforceConstraints 设置为 false、readXml 然后将其设置回 true 来解决。

尝试一下。

这里是文档 http://msdn.microsoft.com/en-us/library/s3bxwk8b(v=vs.80).aspx

编辑:

用户直接将数据加载到 DataTable 中,建议也以流的形式加载数据,以便将网络/磁盘性能问题与对 data.ReadXml(...); 的纯调用隔离开来;

ReadXml 也有一个从流中读取的重载,可以在数据加载到流中后使用。

关于c# - 提高 DataTable.ReadXml 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7346161/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com