.NET Micro Framework, чтение файлов на устройстве с ограниченной памятью - PullRequest
2 голосов
/ 16 декабря 2010

На устройстве ChipworkX мы будем читать файлы, используя:

File.ReadAllBytes(filename);

Но если мы попробуем это на NetDuino Plus, который имеет гораздо меньший объем памяти,
мы просто получаем исключение OutOfMemoryException.

Файлы не такие большие, но я думаю, что в этом случае все относительно (максимум 1,5 КБ).

Как правильно читать файлы на таком устройстве?

Ответы [ 3 ]

5 голосов
/ 16 декабря 2010

Используйте 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);
    }
}

и напишите свой Process метод.Длина блока 1024 - это просто пример, считайте как можно больше больших кусков за раз.Вы можете изменить это в зависимости от данных.

1 голос
/ 16 декабря 2010

Я предполагаю, что вы считаете, что должно быть достаточно памяти.Если это так, то я подозреваю, что размеры внутреннего буфера по умолчанию не дают результатов.Попробуйте явно указать размеры буфера при открытии файла, чтобы он не превышал фактическую длину файла:

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 
0 голосов
/ 31 мая 2015

Когда вы используете устройство с ограниченной памятью, рекомендуется использовать буфер размером с сектор. То, что вы делаете, это обменять скорость на память. Когда у вас мало памяти, вы должны делать вещи медленнее, а сектор - это наименьшая единица, которую вы можете использовать, которая имеет какой-либо смысл.

Я предлагаю буфер 512 байт.

...