1

次のコードを使用して、大きなファイル (280Mb) を UNC パスからバイト配列に読み取ろうとしています。

public void ReadWholeArray(string fileName, byte[] data)
{
    int offset = 0;
    int remaining = data.Length;

    log.Debug("ReadWholeArray");

    FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

    while (remaining > 0)
    {
        int read = stream.Read(data, offset, remaining);
        if (read <= 0)
            throw new EndOfStreamException
                (String.Format("End of stream reached with {0} bytes left to read", remaining));
        remaining -= read;
        offset += read;
    }
}

これは、次のエラーで爆発しています。

System.IO.IOException: Insufficient system resources exist to complete the requested 

ローカル パスを使用してこれを実行すると、正常に動作します。私のテスト ケースでは、UNC パスは実際にはローカル ボックスを指しています。

ここで何が起こっているのですか?

4

3 に答える 3

4

下位の何かが別のバッファに読み込もうとしていて、一度に 280MB をすべて読み込もうとしていると思われます。ネットワークの場合は、ローカルの場合よりも多くのバッファが必要になる場合があります。

一度にすべてを読み取ろうとするのではなく、一度に約 64K を読み取っていました。これは、チャンキングによる過度のオーバーヘッドを回避するのに十分ですが、巨大なバッファーが必要になることを回避します。

個人的には、ファイル サイズが一定であると想定するのではなく、ストリームの最後まで読み取る傾向があります。詳細については、この質問を参照してください。

于 2008-12-22T12:07:05.437 に答える
1

また、書かれたコードは をブロックに入れる必要がFileStreamありusingます。リソースの破棄に失敗すると、「システム リソースが不足しています」というメッセージが表示される可能性が非常に高くなります。

public void ReadWholeArray(string fileName, byte[] data)
{
    int offset = 0;
    int remaining = data.Length;

    log.Debug("ReadWholeArray");

    using(FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
    {
        while (remaining > 0)
        {
            int read = stream.Read(data, offset, remaining);
            if (read <= 0)
                throw new EndOfStreamException
                    (String.Format("End of stream reached with {0} bytes left to read", remaining));
            remaining -= read;
            offset += read;
        }
    }
}
于 2010-03-19T19:18:05.620 に答える
0

十分なサイズで配列が作成されていないようです。渡される前にどのくらいの大きさの配列が割り当てられますか? それとも、必要に応じて Read 関数がデータ配列を再割り当てすると想定していましたか? それはしません。編集:ええと、そうではないかもしれませんが、あなたが得た例外に気づきました。今はわかりません。

于 2008-12-22T19:03:42.057 に答える