2009-10-12 3 views
0

открывает файл поток дорогостоящей операцииоткрывает файл поток дорогостоящая операция

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

идея заключается в том, чтобы загружать только заголовки из файла и получить доступ к данным полезной нагрузки только тогда, когда Релевент поле Доступ

прототип класса будет выглядеть следующим образом в C#

public class OneElement 
{ 
    public Header TheHeader {get; private set;} 

    private string _FileName; 

    private long _StreamPosition; // this value is initialized when the header is read 

    private Payload _ThePayload; 


    public Payload ThePayload 
    { 
     get{ 
        if (_ThePayload == null) 
         using (var stream = File.OpenRead(_FileName)) 
         { 
          stream.seek(_StreamPosition,SeekOrigin.Begin); // seek to the relevent position 
          _ThePayload = ReadPayload(stream); // this method return the paylod read reads from the current position 
         } 
        return _ThePayload; 

       } 
    } 
} 

Будет ли операция открытия файла и получения полезной нагрузки дорогостоящей, особенно в контексте, где полезная нагрузка будет представлять аудио- или видеоданные.

ответ

3

Если вы читаете аудио/видео, то я ожидаю, что вы скорее будете читать много данных. Это затмило бы стоимость всего открытия файла. Однако чтение больших объемов данных с диска является дорогостоящей операцией.

С другой стороны, если вы просто читали несколько байтов за раз, то многократное открытие/закрытие файла не было бы хорошей идеей - лучше было бы читать большие куски и кэшировать их соответствующим образом.

У вас есть эталон для этого? Как это происходит в данный момент? Если он работает нормально, есть ли у вас какие-либо причины, чтобы попытаться подумать о более сложной системе?

+0

У меня не было времени попробовать еще (и нам это действительно не нужно сейчас), я думал о том, чтобы реализовать это как этот случай, чтобы позволить фильтру в большом файле, например получение всего ключевого кадра из файла будет выглядеть так: var keyframes = ListElements.Where (e => e.IsKeyframe); , и это не вызвало бы загрузку всего кадра в целом –

+0

Так что это означало бы загрузку каждого кадра отдельно, открытие и закрытие файла много тысяч раз? Это может быть значительная стоимость. –

1

Открытие файла действительно требует некоторых ресурсов. Но если ваша полезная нагрузка - аудио или видео, будет гораздо более ресурсоемкой, чтобы читать, чем открывать файл.

Итак, если вы пытаетесь кэшировать содержимое, чтобы сохранить один открытый файл, забудьте об этой идее.

Смежные вопросы