IOException la lectura de un archivo grande de una ruta UNC en una matriz de bytes utilizando .NET

StackOverflow https://stackoverflow.com/questions/386088

Pregunta

Estoy utilizando el código siguiente para intentar leer un archivo grande (280MB) en una matriz de bytes de una ruta 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;
    }
}

Este es volar con el siguiente error.

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

Si me quedo esto utilizando una ruta local que funciona bien, en mi caso prueba la ruta UNC apunta realmente al cuadro local.

¿Alguna idea de lo que está pasando aquí?

¿Fue útil?

Solución

Sospecho que algo más abajo está intentando leer en otra memoria intermedia, y la lectura de 280MB todos de una sola vez está fallando. Puede haber más tampones necesarios en el caso de la red que en el caso local.

Me gustaría leer acerca de 64K a la vez en lugar de tratar de leer la totalidad del lote de una sola vez. Eso es suficiente para evitar el exceso de cabeza de fragmentación, pero no serán necesarios enormes amortiguadores.

Personalmente tiendo a leer sólo para el final de la secuencia en lugar de asumir que el tamaño del archivo permanecerá constante. Ver esta pregunta para más información.

Otros consejos

Además, el código como está escrito tiene que poner la FileStream en un bloque using. El no poder disponer de los recursos es una posible razón para la recepción de "recursos insuficientes en el sistema":

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

Parece que la matriz no fue creado con el tamaño suficiente. ¿Qué tan grande de una matriz se asigna antes de ser aprobada en? O es que fueron asumiendo la función de lectura sería reasignar la matriz de datos según sea necesario? No lo hará. Editar: Er, tal vez no, me he dado cuenta de la excepción que tienes. No está seguro ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top