.NET Micro Framework, das Lesen von Dateien auf einem Gerät mit begrenztem Speicher
-
10-10-2019 - |
Frage
Auf einem ChipworkX Gerät würden wir lesen Dateien mit:
File.ReadAllBytes(filename);
Aber wenn wir versuchen, dass auf einem Netduino plus die eine viel geringere Menge an Speicher,
wir einfach eine OutOfMemoryException erhalten.
Die Dateien sind nicht so groß, aber ich denke, das ist alles relativ in diesem Fall (1,5 kb max).
Was ist der richtige Weg, um Dateien auf einem Gerät wie diese zu lesen?
Lösung
Verwenden Sie ein 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);
}
}
Ihre eigene Process
Methode schreiben. Die Blocklänge von 1024 ist nur ein Beispiel, las als große Brocken, wie Sie zu einer Zeit verarbeiten können. Sie können unterschiedlich sein, dass auf die Daten abhängig.
Andere Tipps
Ich gehe davon aus, dass Sie glauben, dass es genügend Speicher sein. Wenn dies so ist, wie ich vermute, dass interne Standardpuffergrößen Dinge wehen. Versuchen Sie explizit Puffergrößen besagt, beim Öffnen der Datei zu halten fest an die tatsächliche Dateilänge:
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
Wenn Sie ein Gerät mit begrenztem Speicher verwenden, ist es eine gute Idee, einen Puffer zu verwenden, die die Größe eines Sektors ist. Was Sie tun, ist Handelsgeschwindigkeit für Speicher. Wenn Sie wenig Speicher haben, müssen Sie Dinge tun langsamer und ein Sektor ist die kleinste Einheit können Sie verwenden, das macht keinen Sinn.
Ich schlage vor, einen Puffer von 512 Byte.