ある座標系から別の座標系にポイントを再投影するメソッドのパフォーマンスを改善しようとしています。
List<Point> Reproject(List<Point> points, string sourceProjection, string destinationProjection)
座標変換を行うために、ポイントをサードパーティのライブラリ (FME) に渡します。私が現在達成しようとしているのは、ポイントの入力リストを取得し、そのリストから個別のポイントのみを選択し、それらのみを元のリストを再構築し、それをクライアントに返します。
私の基本的な計画は、 a を使用しDictionary<Point, int>
てすべての個別のポイントを取得し、それらにインデックスを割り当ててから、インデックスを使用して元のリストを再構築することです。この動作をテストするために書いた大まかなコードを次に示します。
var distinctPoints = new Dictionary<Point, int>();
var distinctPointsMapping = new Dictionary<int, int>();
var pointNumber = 0;
var distinctPointNumber = 0;
foreach (var point in points)
{
if (distinctPoints.ContainsKey(point))
{
distinctPointsMapping.Add(pointNumber, distinctPoints[point]);
}
else
{
distinctPoints.Add(point, distinctPointNumber);
distinctPointsMapping.Add(pointNumber, distinctPointNumber);
distinctPointNumber++;
}
pointNumber++;
}
Console.WriteLine("From an input of {0} points, I found {1} distinct points.", points.Count, distinctPointNumber);
var transformedPoints = new Point[distinctPointNumber]; // replace this with the call to the FME transformer
var returnVal = new List<Point>(points.Count);
pointNumber = 0;
foreach (var untransformedPoint in points)
{
var transformedPoint = transformedPoints[distinctPointsMapping[pointNumber]];
returnVal.Add(transformedPoint);
pointNumber++;
}
return returnVal;
私が現在実行している問題は、約 8M ポイントを超える場合の OutOfMemoryException です。これを行うためのより良い方法があるかどうか疑問に思っていますか?