1

特定のシェープファイルからすべてのフィーチャ データを読み込もうとしています。この場合、DotSpatial を使用してファイルを開き、機能を繰り返し処理しています。この特定のシェープファイルのサイズはわずか 9 MB で、dbf ファイルは 14 MB です。ループする機能はおよそ 75,000 あります。

これはすべてコンソール アプリを介してプログラムで行われるため、レンダリングなどは一切行われないことに注意してください。

形状ファイルをロードするときに、再投影してから繰り返します。再投影の読み込みは非常に高速です。ただし、コードが foreach ブロックに到達するとすぐに、データの読み込みに丸 2 分近くかかり、VisualStudio でのデバッグ時に約 2 GB のメモリを使用します。これは、かなり小さいデータ ファイルに対して、非常に過剰に思えます。

コマンド ラインから Visual Studio の外部で同じコードを実行しましたが、時間はまだ約 2 分で、プロセスには約 1.3 GB のメモリが必要です。

とにかくこれをスピードアップする方法はありますか?

以下は私のコードです:

// Load the shape file and project to GDA94
Shapefile indexMapFile = Shapefile.OpenFile(shapeFilePath);
indexMapFile.Reproject(KnownCoordinateSystems.Geographic.Australia.GeocentricDatumofAustralia1994);

// Get's slow here and takes forever to get to the first item
foreach(IFeature feature in indexMapFile.Features)
{
    // Once inside the loop, it's blazingly quick.
}

興味深いことに、VS イミディエイト ウィンドウを使用すると、非常に高速で、まったく遅延がありません...

4

2 に答える 2

4

これは、非常に大きなファイル (120 万の機能) の場合と同じ問題を抱えており、.Features コレクションにデータが入力されることはありません。

しかし、機能を要求すると、メモリや遅延のオーバーヘッドはありません。

        int lRows = fs.NumRows();
        for (int i = 0; i < lRows; i++)
        {

            // Get the feature
            IFeature pFeat = fs.GetFeature(i); 

            StringBuilder sb = new StringBuilder();
            {
                sb.Append(Guid.NewGuid().ToString());
                sb.Append("|");
                sb.Append(pFeat.DataRow["MAPA"]);
                sb.Append("|");
                sb.Append(pFeat.BasicGeometry.ToString());
            }
            pLinesList.Add(sb.ToString());
            lCnt++;

            if (lCnt % 10 == 0)
            {
                pOld = Console.ForegroundColor;
                Console.ForegroundColor = ConsoleColor.DarkGreen;
                Console.Write("\r{0} de {1} ({2}%)", lCnt.ToString(), lRows.ToString(), (100.0 * ((float)lCnt / (float)lRows)).ToString());
                Console.ForegroundColor = pOld;
            }

        }

GetFeature メソッドを探します。

于 2017-06-06T21:30:33.920 に答える