1


1

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

public void ReadWholeArray(string fileName、byte [] data){int offset = 0; int残り= data.Length;

log.Debug( "ReadWholeArray");

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

while(残存> 0){int read = stream.Read(データ、オフセット、残存); if(read <= 0)が新しいEndOfStreamExceptionをスローします(String.Format( "ストリームの終わりに到達し、{0}バイトの読み込みを続けました"、残り))。残り -  =読み取り。 offset = read; }}

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

System.IO.IOException:要求された処理を完了するのに十分なシステムリソースが存在しません

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

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

3 Answer


4


もっと低い値が別のバッファに読み込もうとしていて、280MBすべてを一気に読み取るのに失敗したのではないかと思います。 ネットワークの場合は、ローカルの場合よりも多くのバッファが必要になる可能性があります。

一度に全部を読むのではなく、一度に約64Kを読みます。 チャンクによる過度のオーバーヘッドを回避するにはこれで十分ですが、巨大なバッファが必要になるのを回避できます。

個人的には、ファイルサイズが一定に保たれると仮定するのではなく、単にストリームの最後まで読み込むことが多いです。 詳細については この質問を参照してください。


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;
        }
    }
}


0


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