我正在尝试读取txt文件(csv或制表符分隔)并将每行转换为Vector3并将其添加到数组然后进一步处理
到目前为止我的代码有效,但在文件中读取需要一段时间。每个正在读入的文件介于6 mb到25 mb之间
代码贯穿并完成了我的期望,但它似乎在这个foreach
语句的某个地方出现了瓶颈?是否有更快的方式或者是否需要预期?
String[] pntsText = File.ReadAllLines(args[0]);
List<Vector3> pnts = new List<Vector3>();
Console.WriteLine("Start Building Points Array ...");
int noOfPnts = pntsText.Length;
int currentPntNo=0;
Console.CursorVisible = false;
foreach (string pntText in pntsText)
{
currentPntNo++;
Console.Clear();
Console.Write(noOfPnts - currentPntNo + " left to process");
string[] splitXYZ = pntText.Split(new string[] { args[1] }, StringSplitOptions.None);
Vector3 ve2 = new Vector3(float.Parse(splitXYZ[0]), float.Parse(splitXYZ[1]), float.Parse(splitXYZ[2]));
pnts.Add(ve2);
}
Console.WriteLine("Points Array Complete");
答案 0 :(得分:3)
我认为问题在于您在控制台上的通知,您可以将它们评论出来并测试您是否获得更好的性能。我建议你使用Stopwatch为程序执行计时。
您还可以尝试以下LINQ查询来获取Vector3
的列表。
List<Vector3> list
= pntsText.Select(r => new { Splitted = r.Split(new string[] { "," }, StringSplitOptions.None) })
.Select(t => new Vector3(float.Parse(t.Splitted[0]), float.Parse(t.Splitted[1]), float.Parse(t.Splitted[2])))
.ToList();
但是这内部循环,所以我不确定你是否从中获得任何性能提升,并且在处理过程中你也不会在控制台上得到输出。
答案 1 :(得分:1)
您正在使用拆分方法拆分您的积分:
string[] splitXYZ = pntText.Split(new string[]
{ args[1] }, StringSplitOptions.None);
在for循环中使用它并不是真正的高效,因为它为返回的数组对象分配内存,为每个数组元素分配一个String对象。考虑使用与Substring组合的IndexOf,我不确定你需要测试它的速度有多快。
关于此问题,请阅读Documentation:
效果注意事项
Split方法为。分配内存 返回数组对象和每个数组元素的String对象。如果 您的应用程序需要最佳性能或管理内存 分配在您的应用程序中至关重要,请考虑使用IndexOf 或者IndexOfAny方法,以及可选的Compare方法,来定位a 字符串中的子字符串。
如果要拆分字符串 分隔符,使用IndexOf或IndexOfAny方法来定位 字符串中的分隔符。如果要拆分字符串 分隔符字符串,使用IndexOf或IndexOfAny方法来定位 分隔符字符串的第一个字符。然后使用Compare方法 确定第一个字符后面的字符是否为 等于分隔符字符串的剩余字符。
另一点是你正在为每个返回的点数组创建一个对象(Vector),包括Parse部分的3倍,这也会产生一些性能:
Vector3 ve2 = new Vector3(float.Parse(splitXYZ[0]),
float.Parse(splitXYZ[1]), float.Parse(splitXYZ[2]));
如果此时确实不需要(取决于您的需要),您可以将信息保存为文本形式甚至是结构,并在需要稍后处理它时创建Vector对象。
希望这有帮助
答案 2 :(得分:1)
将整个文件读入一个字符串并调用str.Split(new[] {',', '\n'})
以获取所有向量部分的单个数组。然后循环,在3s解析它们。这样可以防止多次调用Split
。还要避免在每次迭代时更新控制台。也许每100个?