2

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>
4

1 に答える 1

2

私はずっと前に同じ問題を抱えていましたが、EnforceConstraints を false に設定し、readXml を true に戻すことで解決しました。

やってみて。

ここでドキュメントhttp://msdn.microsoft.com/en-us/library/s3bxwk8b(v=vs.80).aspx

編集:

ユーザーはデータを DataTable に直接ロードしています。ストリームにデータをロードして、ネットワーク/ディスクのパフォーマンスの問題を純粋な呼び出しから分離することもお勧めします。data.ReadXml(...);

ReadXml には、データがストリームにロードされた後に使用できるストリームから読み取るためのオーバーロードもあります。

于 2011-09-09T06:37:29.140 に答える