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

파일을 여는 데 약간의 리소스가 필요합니다. 그러나 페이로드가 오디오 또는 비디오 인 경우 파일을 여는 것보다 리소스를 더 많이 읽어야합니다.

그래서 당신이 하나의 파일을 저장하기 위해 내용을 캐시하려고하는 경우에 대비하여 그 생각을 잊어 버리십시오.

관련 문제