1

ディスクに2kのチャンクで書き込む5MBのバイト[]があります。2k (c_writeSizeInBytes) のチャックを取得するには:

int numberOfIterations = bytes.Length / c_writeSizeInBytes;
                    for (int i = 0; i < numberOfIterations; i++)
                    {
                        bool nearEnd = bytes.Length - i == c_writeSizeInBytes;
                        byte[] buffer = nearEnd ? bytes.Skip(i * c_writeSizeInBytes).ToArray() : bytes.Skip(i * c_writeSizeInBytes).Take(c_writeSizeInBytes).ToArray();
                        binaryWriter.Write(buffer, 0, c_writeSizeInBytes);

                    }

2MB を超えると 5MB のファイルではパフォーマンスが非常に遅くなります。それを最適化する方法はありますか?

ありがとう

4

5 に答える 5

12

Skip/ Take/の使用は、ToArrayここでは非常に非効率的です。チャンクで書き込む必要がある場合は、オフセットを に渡すだけWriteです。

binaryWriter.Write(buffer, i * CHUNK_SIZE, CHUNK_SIZE);

(おそらくMath.Min、チャンクの完全な数ではない場合に備えて、残りのカウントを取得するために最後のチャンクでいくつかを使用します)

ただし、すでにデータを として持っている場合は、これを行う必要はありません。byte[]を 1 回呼び出すだけWriteです。

binaryWriter.Write(buffer, 0, buffer.Length);

ファイル全体を書き込んでいる場合 (つまり、このデータが古いデータを置き換えている場合) は、単にFile.WriteAllBytes.

于 2013-05-01T13:39:20.950 に答える
0

2k チャンク サイズのみを書き込むように強制する制約がどのようなものかわかりませんが、これを行う必要がある場合は、この方法を試してください

  public void Write(Byte[] bytes,System.IO.Stream stream)
    {
        int chunkSize = 2 * 1024; //2k
        int offset = 0;
        do
        {
            var count = offset + chunkSize > bytes.Length ? bytes.Length - offset : chunkSize;
            stream.Write(bytes, offset, count);
            offset += count;

        } while (offset < bytes.Length);
    }
于 2013-05-01T13:47:34.407 に答える