ReadXml を介して XML ファイルからロードしている ADO DataSet があります。データとスキーマは別のファイルにあります。
現在、この DataSet をロードするのに 13 秒近くかかります。DataSet のスキーマを読み取らず、ReadXml にスキーマを推測させるだけで、これを 700 ミリ秒に短縮できますが、結果の DataSet には制約が含まれていません。
私はこれをやってみました:
Console.WriteLine("Reading dataset with external schema.");
ds.ReadXmlSchema(xsdPath);
Console.WriteLine("Reading the schema took {0} milliseconds.", sw.ElapsedMilliseconds);
foreach (DataTable dt in ds.Tables)
{
dt.BeginLoadData();
}
ds.ReadXml(xmlPath);
Console.WriteLine("ReadXml completed after {0} milliseconds.", sw.ElapsedMilliseconds);
foreach (DataTable dt in ds.Tables)
{
dt.EndLoadData();
}
Console.WriteLine("Process complete at {0} milliseconds.", sw.ElapsedMilliseconds);
これを行うと、スキーマの読み取りに 27 ミリ秒かかり、DataSet の読み取りに 12000 ミリ秒以上かかります。これは、すべての DataTable で EndLoadData を呼び出す前に報告された時間です。
これは膨大な量のデータではありません。約 1.5 MB で、ネストされたリレーションはなく、すべてのテーブルには 6 ~ 30 文字の列が 2 つまたは 3 つ含まれています。スキーマを前もって読んだ場合に異なることがわかる唯一のことは、スキーマにはすべての一意の制約が含まれているということです。しかし、BeginLoadData は制約をオフにすることになっています (変更通知なども同様です)。したがって、ここでは当てはまりません。(はい、EnforceConstraints を false に設定してみました。)
オブジェクトにスキーマを推測させるのではなく、最初にスキーマを読み取ることで DataSet の読み込み時間を改善したという多くの報告を読みました。私の場合、スキーマを推測すると、スキーマを明示的に提供するよりも約 20 倍高速なプロセスが実現します。
これは私を少し夢中にさせています。この DataSet のスキーマは、メタ情報から生成されます。私は、それをプログラムで作成し、XmlReader で非シリアル化するだけのメソッドを書きたいと思っています。しかし、私はそうしないほうがいいです。
私は何が欠けていますか?ここで速度を向上させるために他に何ができますか?