编辑:我追查了原因。后来在代码中我犯了一个错误,导致非碰撞记录被合并到主数据存储中(在下面的代码中为t),对于它没有碰撞的每个记录,基本上每个记录除了一个它确实发生了碰撞,因此经过几千次比较后,主列表将呈指数级增长,而且会有几万亿条记录,而不是几百条记录。
我正在尝试排序,搜索和合并300-400套的大量3d数据点。我遇到了单个linq线的问题,这似乎占据了我处理时间的90-95%。大约3000套,处理时间几乎不存在,但是当我达到3000时,整个过程几乎停止了。
dottrace告诉我,我所有的处理时间都是专门的调用和等待.tolist(),但是我找不到更高效的linq替代方案。 (我总是可以回到我对这个问题的c ++实现,但我希望linq可能有一个比我能合理提出的更有效的解决方案。)
有问题的linq是
List<Point> collisions = t.Points.Intersect(streamline.Points, new PointsComparer()).ToList();
此查询的目的是获取t中的所有点和流线中的所有点,比较它们,并生成所有重复点的列表。
值得注意的是,t.Points和streamline.Points已经预先排序,所以我可以对它们进行二进制搜索,但我不确定如何用linq做这个。
如果有人能够解释我在这里失踪的原因导致它试图生成这么多列表,那么会非常感激。
为了更好的衡量,这里是point和PointsComparer类。 (t.points和streamline.Points是列表)
public class PointsComparer : IEqualityComparer<Point> {
public bool Equals(Point x, Point y) {
if (object.ReferenceEquals(x,y)) return true;
return x.X.Equals(y.X) && Equals(x.Y, y.Y) && Equals(x.Z, y.Z);
}
public int GetHashCode(Point obj) {
int xhash = obj.X.GetHashCode();
int yhash = obj.Y.GetHashCode();
int zhash = obj.Z.GetHashCode();
return xhash ^ yhash ^ zhash;
}
}
public class Point {
public float X;
public float Y;
public float Z;
public float[] Scalars = {};
public int OriginalIndex;
}