1

コードを高速化したい。そのスニペットがより速く動作することを望みます。ループの独自の実装を作成しようとしましたParallel.Forが、失敗しました。エラーはありませんが、tifDS空のようです:/ 誰か助けてくれませんか? 前もって感謝します!

元のループ:

for (int iY = 0; iY < srcDS.RasterYSize; iY++)
{
    byte[] srcData = new byte[srcDS.RasterXSize * 1];
    srcBand.ReadRaster(0, iY, srcDS.RasterXSize, 1, srcData, srcDS.RasterXSize, 1, 0, 0);

    for (int iBand = 0; iBand < _outBands; iBand++)
    {
        int[] bandLookup = lookup[iBand];

        int[] dstData = new int[srcData.Count()];
        for (int index = 0; index < srcData.Count(); index++)
        {
            byte b = srcData[index];
            dstData[index] = bandLookup[b];
        }

        tifDS.GetRasterBand(iBand + 1).WriteRaster(0, iY, srcDS.RasterXSize, 1, dstData,
                                                   srcDS.RasterXSize, 1, 0, 0);
    }
}

私の試み:

for (int iY = 0; iY < srcDS.RasterYSize; iY++)
{
    byte[] srcData = new byte[srcDS.RasterXSize * 1];
    srcBand.ReadRaster(0, iY, srcDS.RasterXSize, 1, srcData, srcDS.RasterXSize, 1, 0, 0);

    Parallel.For<object>((long) 0, _outBands, () => 0,
                         (iBand, state, subtotal) =>
                             {
                                 int[] bandLookup = lookup[iBand];

                                 int[] dstData = new int[srcData.Count()];
                                 for (int index = 0; index < srcData.Count(); index++)
                                 {
                                     byte b = srcData[index];
                                     dstData[index] = bandLookup[b];
                                 }

                                 return new object[] {iBand, dstData};
                             },
                         o =>
                             {
                                 int iBand = (int) (o as object[])[0];
                                 int[] dstData = (o as object[])[1] as int[];
                                 lock (_getRasterBandLock)
                                 {
                                     tifDS.GetRasterBand(iBand + 1).WriteRaster(0, iY, srcDS.RasterXSize, 1, dstData,
                                                   srcDS.RasterXSize, 1, 0, 0);
                                 }
                             });
}
4

0 に答える 0