ChipworkXデバイスでは、次を使用してファイルを読み取ります。
File.ReadAllBytes(filename);
しかし、メモリの量がはるかに少ないNetDuino Plusでこれを試してみると
、OutOfMemoryExceptionが発生します。
ファイルはそれほど大きくはありませんが、この場合はすべて相対的だと思います(最大1.5kb)。
このようなデバイスでファイルを読み取る正しい方法は何ですか?
ChipworkXデバイスでは、次を使用してファイルを読み取ります。
File.ReadAllBytes(filename);
しかし、メモリの量がはるかに少ないNetDuino Plusでこれを試してみると
、OutOfMemoryExceptionが発生します。
ファイルはそれほど大きくはありませんが、この場合はすべて相対的だと思います(最大1.5kb)。
このようなデバイスでファイルを読み取る正しい方法は何ですか?
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);
}
}
独自のProcess
メソッドを作成します。1024のブロック長は単なる例であり、一度に処理できる大きなチャンクとして読み取られます。データに応じて変更できます。
十分なメモリがあるはずだとあなたは信じていると思います。もしそうなら、私は内部のデフォルトのバッファサイズが物事を吹き飛ばしているのではないかと思います。ファイルを開くときにバッファサイズを明示的に指定して、実際のファイルの長さに合わせてください。
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
メモリが限られているデバイスを使用している場合は、セクターのサイズのバッファーを使用することをお勧めします。あなたがしているのは、速度とメモリの交換です。メモリが少ない場合は、ゆっくりと作業を行う必要があります。セクターは、使用できる最小の単位であり、意味があります。
512バイトのバッファをお勧めします。