2011-09-08 8 views
2

J'écris un DataTable en XML avec la méthode DataTable.WriteXml(). Cela prend quelques secondes, ce qui me semble très bien. Cependant, la lecture du fichier (taille de 38 Mo, 26 000 rangs, 36 colonnes) à l'aide de la méthode ReadXml() prend 3 minutes! J'utilise déjà la méthode DataTable.BeginLoadData() avant d'appeler le ReadXml (qui l'a rendu ~ 10 secondes plus rapide), mais y a-t-il autre chose que je puisse faire pour améliorer les performances?Améliorer les performances DataTable.ReadXml

Voici la méthode de chargement:

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

Je l'ai utilisé et chronomètre pour des points d'arrêt voir qu'il est en fait la méthode ReadXml qui est la partie qui prend du temps.

Voici le schéma 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

Vous devrez montrer du code, y compris le schéma de votre table et la surcharge de ReadXml() que vous appelez. J'ai effectué un test rapide et je n'ai pas remarqué de problèmes de performance comme celui-ci. –

+0

J'ai modifié mon message original. J'espère que je n'ai pas mal compris ce que vous vouliez dire par schéma. – Kjetil

Répondre

2

J'ai eu même problème il y a longtemps, résolu en mettant EnforceConstraints false, ReadXML revenir ensuite mis vrai.

Essayez-le.

Voici les docs http://msdn.microsoft.com/en-us/library/s3bxwk8b(v=vs.80).aspx

EDIT:

utilisateur chargement des données dans un DataTable directement, a également suggéré de charger des données dans un flux afin d'isoler des problèmes de performances réseau/disque à partir de l'appel pur data.ReadXml(...);

ReadXml a également une surcharge à lire à partir d'un flux qui pourrait être utilisé après que les données ont été chargées dans un flux.

+0

Je fais le ReadXml directement à un DataTable. Le DataTable n'appartient pas à un DataSet. – Kjetil

+1

Ok, vu, est le fichier que vous chargez sur le réseau ou sur la machine locale? Vous pouvez essayer de charger d'abord le fichier dans un flux et de voir combien de temps cela prend alors vous savez si le problème est le disque/réseau ou le chargement de données. –

+0

À partir d'un lecteur local, 34739233 octets n'ont pris aucun temps avec un flux de fichiers (le lire dans un tableau d'octets pour les tests). Ainsi, au lieu d'utiliser la surcharge ReadXml (string FilePath), j'ai testé la surcharge ReadXml (Stream filestream). Le temps de chargement est maintenant de seulement 20 secondes! C'est assez bon pour moi. Devrais-je répondre à ma propre question avec ce que j'ai compris? – Kjetil

Questions connexes