.NET Micro Framework, чтение файлов на устройстве с ограниченной памятью

StackOverflow https://stackoverflow.com/questions/4461196

Вопрос

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

File.ReadAllBytes(filename);

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

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

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

Это было полезно?

Решение

Использовать 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 является лишь примером, прочитанным настолько большими кусками, насколько вы можете обрабатывать за раз. Вы можете варьироваться в зависимости от данных.

Другие советы

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

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 байтов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top