首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高DataTable.ReadXml性能

提高DataTable.ReadXml性能
EN

Stack Overflow用户
提问于 2011-09-08 17:51:43
回答 1查看 2.7K关注 0票数 2

我正在使用DataTable.WriteXml()-method编写到xml的DataTable。这需要几秒钟,我认为这是非常好的。

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

加载方法如下:

代码语言:javascript
复制
            data = new DataTable();
            data.BeginLoadData();
            data.ReadXml(filedialog.FileName);
            data.EndLoadData();

我使用了断点和秒表,以了解ReadXml方法才是最耗时的部分。

下面是XML方案:

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-09 14:37:29

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

试一试。

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

编辑:

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7346161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档