C# 如果我';我在使用模式吗?

C# 如果我';我在使用模式吗?,c#,performance,ado.net,dataset,readxml,C#,Performance,Ado.net,Dataset,Readxml,我有一个ADO数据集,通过ReadXml从它的XML文件中加载。数据和模式位于不同的文件中 现在,加载此数据集需要将近13秒的时间。如果我不读取数据集的模式,只让ReadXml推断模式,但结果数据集不包含任何约束,那么我可以将其缩短到700毫秒 我试过这样做: Console.WriteLine("Reading dataset with external schema."); ds.ReadXmlSchema(xsdPath); Console.WriteLine("Reading the s

我有一个ADO数据集,通过ReadXml从它的XML文件中加载。数据和模式位于不同的文件中

现在,加载此数据集需要将近13秒的时间。如果我不读取数据集的模式,只让ReadXml推断模式,但结果数据集不包含任何约束,那么我可以将其缩短到700毫秒

我试过这样做:

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毫秒,读取数据集需要12000多毫秒。这是我调用所有数据表上的EndLoadData之前报告的时间

这不是一个巨大的数据量-大约1.5mb,没有嵌套关系,所有表都包含两列或三列6-30个字符。如果我预先阅读模式,我唯一能想到的是,模式包含所有唯一的约束。但是BeginLoadData应该关闭约束(以及更改通知等)。所以这在这里不适用。(是的,我已经尝试将EnforceConstraints设置为false。)

我读过很多关于人们通过先读取模式而不是让对象推断模式来改进数据集加载时间的报告。在我的例子中,推断模式的过程比显式提供模式快20倍左右

这让我有点疯狂。这个数据集的模式是根据元信息生成的,我很想编写一个方法,通过编程创建它,然后用XmlReader反序列化它。但我更愿意不去


我错过了什么?我还能做些什么来提高这里的速度呢?

这并不是一个答案,确切地说(尽管它总比什么都没有好,这是我到目前为止所得到的),但在与这个问题斗争了很长时间后,我发现当我的程序没有在Visual Studio中运行时,它完全不存在


有一点我以前没有提到,这使得这一点更加神秘,那就是当我将一个不同的(但相当大的)XML文档加载到数据集中时,程序运行得很好。我现在想知道我的一个数据集是否附加了某种元信息,VisualStudio正在运行时检查,而另一个没有。我不知道。

确切地说,这不是一个答案(尽管这总比什么都没有好,这是我迄今为止所得到的),但在与这个问题斗争了很长时间后,我发现当我的程序没有在Visual Studio中运行时,它完全不存在


有一点我以前没有提到,这使得这一点更加神秘,那就是当我将一个不同的(但相当大的)XML文档加载到数据集中时,程序运行得很好。我现在想知道我的一个数据集是否附加了某种元信息,VisualStudio正在运行时检查,而另一个没有。我不知道。

尝试的另一个维度是在没有模式的情况下读取数据集,然后将其读入启用了约束的类型化数据集。这样一来,当它构建用于强制执行约束的索引时,它手头上就有了所有的数据——也许这样会更有效

发件人:

合并方法通常被调用 在一系列程序的末尾 包括验证更改, 协调错误,更新数据 源代码进行更改,最后 刷新现有数据集


要尝试的另一个维度是在没有模式的情况下读取数据集,然后将其读入启用了约束的类型化数据集。这样一来,当它构建用于强制执行约束的索引时,它手头上就有了所有的数据——也许这样会更有效

发件人:

合并方法通常被调用 在一系列程序的末尾 包括验证更改, 协调错误,更新数据 源代码进行更改,最后 刷新现有数据集


我将尝试对以纯文本文件和xml文件存储数据进行性能比较

第一个函数创建两个文件:一个文件包含1000000条纯文本记录,另一个文件包含1000000条xml(相同数据)记录。首先,您必须注意文件大小的差异:~64MB(纯文本)与~102MB(xml文件)

void创建_文件()
{
//创建包含数据的文本文件
StreamWriter sr=新的StreamWriter(“plain_text.txt”);

对于(inti=0;i,我将尝试对以文本纯文件和xml文件存储数据进行性能比较

第一个函数创建两个文件:一个文件包含1000000条纯文本记录,另一个文件包含1000000条xml(相同数据)记录。首先,您必须注意文件大小的差异:~64MB(纯文本)与~102MB(xml文件)

void创建_文件()
{
//创建包含数据的文本文件
StreamWriter sr=新的StreamWriter(“plain_text.txt”);

对于(int i=0;iXML解析只是我所描述时间的一小部分。一个
XmlReader
可以在半秒钟内遍历我存储的
DataSet
。您的建议可能会将这半秒钟缩短到几乎为零。但是,其他12.5秒不是由XML解析引起的呢?XML解析是整个过程的一小部分我正在描述的IME。一个
XmlReader
可以在半秒内遍历我存储的
DataSet
。您的建议可能会将这半秒缩短到几乎为零。但是其他12.5秒不是由XML解析引起的呢?
void create_files()
    {
        //create text file with data
        StreamWriter sr = new StreamWriter("plain_text.txt");

        for(int i=0;i<1000000;i++)
        {
            sr.WriteLine(i.ToString() + "<SEP>" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbb" + i.ToString());
        }

        sr.Flush();
        sr.Close();

        //create xml file with data
        DataSet ds = new DataSet("DS1");

        DataTable dt = new DataTable("T1");

        DataColumn c1 = new DataColumn("c1", typeof(int));
        DataColumn c2 = new DataColumn("c2", typeof(string));

        dt.Columns.Add(c1);
        dt.Columns.Add(c2);

        ds.Tables.Add(dt);

        DataRow dr;

        for(int j=0; j< 1000000; j++)
        {
            dr = dt.NewRow();
            dr[0]=j;
            dr[1] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbb" + j.ToString();
            dt.Rows.Add(dr);
        }

        ds.WriteXml("xml_text.xml");

    }
void read_files()
    {

        //timers
        Stopwatch stw = new Stopwatch();
        long milliseconds;

        //read text file in a dictionary

        Debug.WriteLine("Start read Text file into memory");

        stw.Start();
        milliseconds = 0;

        StreamReader sr = new StreamReader("plain_text.txt");
        Dictionary<int, string> dict = new Dictionary<int, string>(1000000);
        string line;
        string[] sep = new string[]{"<SEP>"};
        string [] arValues;
        while (sr.EndOfStream!=true) 
        {
            line = sr.ReadLine();
            arValues = line.Split(sep,StringSplitOptions.None);
            dict.Add(Convert.ToInt32(arValues[0]),arValues[1]);
        }

        stw.Stop();
        milliseconds = stw.ElapsedMilliseconds;

        Debug.WriteLine("Text file loaded into memory in " + milliseconds.ToString() + " milliseconds" );



        //create xml structure
        DataSet ds = new DataSet("DS1");

        DataTable dt = new DataTable("T1");

        DataColumn c1 = new DataColumn("c1", typeof(int));
        DataColumn c2 = new DataColumn("c2", typeof(string));

        dt.Columns.Add(c1);
        dt.Columns.Add(c2);

        ds.Tables.Add(dt);

        //read xml file

        Debug.WriteLine("Start read XML file into memory");

        stw.Restart();
        milliseconds = 0;

        ds.ReadXml("xml_text.xml");

        stw.Stop();
        milliseconds = stw.ElapsedMilliseconds;

        Debug.WriteLine("XML file loaded into memory in " + milliseconds.ToString() + " milliseconds");

    }