IOException la lectura de un archivo grande de una ruta UNC en una matriz de bytes utilizando .NET
-
23-08-2019 - |
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í?
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.