.NET Micro Framework, la lettura dei file su un dispositivo con memoria limitata
-
10-10-2019 - |
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?
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.