IOException чтение большого файла из UNC-пути в байтовый массив с использованием .NET - PullRequest
1 голос
/ 22 декабря 2008

Я использую следующий код для попытки чтения большого файла (280 МБ) в байтовый массив из пути 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 фактически указывает на локальное поле.

Есть мысли, что здесь происходит?

Ответы [ 3 ]

4 голосов
/ 22 декабря 2008

Я подозреваю, что что-то внизу пытается прочитать в другой буфер, и чтение всех 280 МБ за один раз терпит неудачу. В сетевом случае может потребоваться больше буферов, чем в локальном.

Я бы читал около 64K за раз вместо того, чтобы пытаться прочитать весь лот за один раз. Этого достаточно, чтобы избежать слишком больших накладных расходов при разбивке, но вы избежите необходимости в огромных буферах.

Лично я склонен просто читать до конца потока, а не предполагать, что размер файла останется постоянным. См. этот вопрос для получения дополнительной информации.

1 голос
/ 19 марта 2010

Кроме того, при написании кода необходимо поместить 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 голосов
/ 22 декабря 2008

Похоже, массив не был создан с достаточным размером. Насколько большой массив выделяется перед передачей в? Или вы предполагали, что функция Read перераспределяет массив данных по мере необходимости? Не будет Редактировать: Э-э, может и нет, я только что заметил исключение, которое вы получили Не уверен сейчас.

...