Pregunta

En un dispositivo ChipworkX que leería archivos mediante:

File.ReadAllBytes(filename);

Pero si tratamos de que en un Netduino Plus, que tiene una cantidad mucho menor de la memoria,
simplemente obtenemos una OutOfMemoryException.

Los archivos no son tan grandes, pero supongo que eso es todo lo relativo en este caso (1,5 kb máx).

¿Cuál es la forma correcta de leer archivos en un dispositivo como este?

¿Fue útil?

Solución

Utilice un FileStream

using (var fileStream = new FileStream(filename, FileMode.Open))
{
    byte[] block = new byte[1024];
    int readLength;
    while ((readLength = fileStream.Read(block, 0, block.Length)) > 0)
    {
        Process(block, readLength);
    }
}

escribir su propio método Process. La longitud del bloque de 1024 es sólo un ejemplo, lea como grandes trozos como se puede procesar a la vez. Puede variar dependiendo de que los datos.

Otros consejos

Estoy asumiendo que usted cree que no debe haber suficiente memoria. Si esto es así, sospecho que el tamaño de búfer predeterminado internos están soplando cosas. Tratar de forma explícita que indica el tamaño de búfer al abrir el archivo para mantenerlo ajustado a la longitud real del archivo:

string path = //some path
byte[] buffer;
int bufferSize = (int)new FileInfo(path).Length;

using (FileStream fs = new FileStream(
    path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize))
{
    buffer = new byte[bufferSize];

    fs.Read(buffer, 0, buffer.Length);
}

//do stuff with buffer 

Cuando se utiliza un dispositivo con memoria limitada, es una buena idea usar un tampón que tiene el tamaño de un sector. Lo que está haciendo es la velocidad de negociación para la memoria. Cuando se tiene poca memoria, debe hacer las cosas más despacio y un sector es la unidad más pequeña que puede utilizar eso tiene algún sentido.

Me sugieren un buffer de 512 bytes.

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