我正在使用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还具有从流读取的重载,可以在将数据加载到Stream中之后使用。