2011-09-08 103 views
2

我正在用DataTable.WriteXml()方法將一個DataTable寫入xml。這需要幾秒鐘,我認爲這非常好。改進DataTable.ReadXml性能

但是,使用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> 
+0

您將不得不顯示一些代碼,包括表的模式以及您調用的ReadXml()的哪個重載。我運行了一個快速測試,沒有注意到任何性能問題。 –

+0

我編輯了我原來的帖子。我希望我沒有誤解你的模式意味着什麼。 – Kjetil

回答

2

我有同樣的問題,前不久,通過EnforceConstraints設置爲false解決,ReadXML的然後將其設置回真實的。

試一試。

在這裏,文檔http://msdn.microsoft.com/en-us/library/s3bxwk8b(v=vs.80).aspx

編輯:

用戶數據加載到數據表中直接地,建議可以在一個流中加載的數據,以便從純呼叫隔離網絡/磁盤性能問題data.ReadXml(...);

ReadXml有一個重載讀取流,可以在流中加載數據之後使用該流。

+0

我正在將ReadXml直接寫入DataTable。 DataTable不屬於DataSet。 – Kjetil

+1

好吧,看過它,是你在網絡上還是在本地機器上加載的文件?您可以嘗試首先在流中加載文件,然後查看需要多長時間,然後知道問題是磁盤/網絡還是數據加載。 –

+0

從本地驅動器,34739233字節完全沒有花時間使用文件流(將其讀入字節數組進行測試)。所以,我沒有使用ReadXml(字符串FilePath)重載,而是測試了ReadXml(Stream filestream)重載。加載所需的時間現在只有20秒!這對我來說已經夠好了。我應該用自己的想法回答自己的問題嗎? – Kjetil