Domanda

In un dispositivo ChipworkX vorremmo leggere i file utilizzando:

File.ReadAllBytes(filename);

Ma se cerchiamo che su un Netduino Plus che ha una quantità molto più piccola della memoria,
abbiamo semplicemente otteniamo un OutOfMemoryException.

I file non sono così grande, ma credo che sia tutto relativo in questo caso (1.5kb max).

Qual è il modo corretto di leggere i file su un dispositivo come questo?

È stato utile?

Soluzione

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

scrivere il proprio metodo di Process. La lunghezza del blocco di 1024 è solo un esempio, letta come grandi blocchi come si può processo alla volta. Si può variare a seconda che i dati.

Altri suggerimenti

Io parto dal presupposto che tu credi che ci dovrebbe essere sufficiente memoria. Se è così, ho il sospetto che le dimensioni del buffer di default interni soffiano cose. Prova affermando esplicitamente dimensioni del buffer quando si apre il file di tenerlo stretto per la lunghezza del file vero e proprio:

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 

Quando si utilizza un dispositivo con memoria limitata, è una buona idea usare un buffer che è la dimensione di un settore. Quello che state facendo è la velocità di scambio per la memoria. Quando si dispone di poca memoria, è necessario fare le cose più lentamente e un settore è la più piccola unità è possibile utilizzare questo ha un senso.

Ho un buffer di 512 byte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top