如何让xml更快地进行csv解析/转换?

时间:2015-06-19 19:29:18

标签: c# xml parsing csv

我目前正在使用下面的代码段在中间进行一些处理后将xml数据(格式不正确)转换为.CSV格式。它仅转换xml数据中包含列表testList(List<int> testList)中的整数的元素。只有在匹配完成后,它才会转换并写入文件。我需要将此算法用于大小为几GB的文件。目前它在~7.5分钟内处理1 Gb文件。有人可以建议我为提高性能而做出的任何改变吗?我已经修复了我所能做的一切,但它不会更快。任何帮助将不胜感激!

注意:Message.TryParse是我必须使用的外部解析方法,不能排除或更改。 注意:StreamElements只是一个可以提高性能的自定义Xmlreader。

foreach (var element in StreamElements(p, "XML"))
                {
                    string joined = string.Concat(element.ToString().Split().Take(3)) + string.Join(" ", element.
                        ToString().Split().Skip(3));
                    List<string> listX = new List<string>();
                    listX.Add(joined.ToString());
                    Message msg = null;
                    if (Message.TryParse(joined.ToString(), out msg))
                    {
                        var values = element.DescendantNodes().OfType<XText>()
                        .Select(v => Regex.Replace(v.Value, "\\s+", " "));

                        foreach (var val in values)
                        {
                            for (int i = 0; i < testList.Count; i++)
                            {
                                if (val.ToString().Contains("," + testList[i].ToString() + ","))
                                {
                                    var line = string.Join(",", values);
                                    sss.WriteLine(line);
                                }
                            }
                        }
                    }
    }

1 个答案:

答案 0 :(得分:1)

我看到了一些你可能会改进的事情:

  • .ToString()已经是字符串时,您在joined上呼叫joined几次。
  • 您可以通过在循环之外首先编译正则表达式来加速正则表达式替换。
  • 您多次迭代values,每次必须重新评估构成values定义的LINQ。在将该LINQ语句的结果保存到.ToList()
  • 之前,请尝试使用values

但是在关注这样的事情之前,你真的需要确定代码中花费时间的东西。我的猜测是,这几乎都花在这两个地方:

  1. 从XML流中读取
  2. 写信至sss
  3. 如果我是对的,那么你关注的任何事情都将是过早的优化。花一些时间测试如果你注释掉for循环的各个部分会发生什么,看看所有时间花在哪里。