我目前正在使用下面的代码段在中间进行一些处理后将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);
}
}
}
}
}
答案 0 :(得分:1)
我看到了一些你可能会改进的事情:
.ToString()
已经是字符串时,您在joined
上呼叫joined
几次。values
,每次必须重新评估构成values
定义的LINQ。在将该LINQ语句的结果保存到.ToList()
。values
但是在关注这样的事情之前,你真的需要确定代码中花费时间的东西。我的猜测是,这几乎都花在这两个地方:
sss
如果我是对的,那么你关注的任何事情都将是过早的优化。花一些时间测试如果你注释掉for
循环的各个部分会发生什么,看看所有时间花在哪里。