2009-08-20 2 views
2

3.7GB 파일에서 작은 데이터 시퀀스를 읽어야합니다. 필자가 읽어야하는 위치는 이고 인접한 것은이지만 파일을 처음부터 끝까지 읽을 수 있도록 IO를 주문할 수 있습니다.디스크 입출력 대기열 활용 ​​방법

파일은 대기열에있는 IO를 처리/최적화 할 수 있어야하는 iSCSI SAN에 저장됩니다.

질문은 한 번에 필요한 모든 데이터/위치에 대해 한 번만 요청할 수 있습니다. 가능한가? IO는 옵션입니다 비동기 (가) 읽기 때문에 나는 생각하지 않는다 있습니다 (20 ~ 200 바이트)

는 현재 코드는 다음과 같습니다 아주 작은 :이 I를 향상시킬 수있는 방법을 찾고 있어요

using (var fileStream = new FileStream(dataStorePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    for (int i = 0; i < internalIds.Count();i++) 
    { 
     fileStream.Position = seekPositions[i].SeekPosition; 
     ... = Serializer.DeserializeWithLengthPrefix<...>(fileStream, PrefixStyle.Base128); 

    } 
    ... 
} 

을/O 다소 하위 수준의 읽기 성능을 얻기 때문에. 머리를 움직이는 모든 탐색 시간이 합산되는 것 같습니다.

답변

1

Performance Monitor (Microsoft Sysinternals)을 실행 해 보셨습니까?

나는 문제가 무엇인지 확실하지 않지만, 나는 추측을 할 것입니다. SAN에서 읽는다면 디스크 액세스로 인해 네트워크 요청이 발생한다고 생각합니다. 첫 번째 읽기 요청을 보냅니다, 읽기 및 데이터 버퍼링 및 Serializer 개체를 생성합니다. 두 번째 요청이 전송 될 때까지 SAN 디스크는 계속해서 회전하므로 데이터가 제자리에 돌아갈 때까지 기다려야합니다.

멀티 스레딩을 시도해 보셨습니까? 순차적 인 순서로 처리해야하는 파일 섹션의 Queue를 설정하고, 일부 스레드를 회전시키고, 파일을 개별적으로 열어보고 (FileSharing.Read를 사용하여 모든 파일을 한 번에 액세스 할 수있게하는 경우) 성능에 대해 궁금합니다. 그런 다음 대기열에서 작업을 시작하도록하십시오. 다른 콜렉션에 결과를 출력하십시오. 출력의 순서가 중요한 경우 출력을 원래의 순서대로 정렬합니다.

--- 편집 ---

당신은 ReadFileScatter API를 시도? Here's a P-invoke signature from pinvoke.net. 그냥 레코드에 대한

+0

+1 질문 이해. 정확히 무슨 일이 일어나고 있는지, 두 번째 읽기를 완료해야 할 때까지 디스크가 이미 회전 했으므로 하드웨어 대기열을 만드는 방법을 모색하고 있습니다. – andreialecu

+0

나는 Windows가 하드웨어 대기열을 처리한다고 생각했을 것이다. 당신은 분명히 C# 기반의 하드 드라이브로 중세를 얻을 수 없습니다. "여기로 가서 X 바이트를 읽으라고"라고 말할 수 있습니다. 여러 스레드를 사용하여 다양한 액세스 패턴을 실험 해 보았습니다.두 스레드가 A와 B, C와 D를 읽으면 더 빠를 것입니다. 또는 A와 M, 그 다음 B와 N –

+0

ReadFileScatter API는 유망한 것으로 들립니다. 내 대답에 대한 광고문을 추가했습니다. –

0

단일 스레드 디스크 프록시로 백그라운드 스레드를 만듭니다. 모든 읽기 작업을이 파일에 보내고 읽기 작업을 정렬하고 병합하십시오. 두 개 이상의 영역이 닫힌 경우 해당 영역을 포함하는 전체 섹터를 읽고 데이터의 하위 섹션을 가져옵니다. 데이터를 비동기 적으로 리턴하십시오.

+0

읽기는 이미 주문되었으며 FileStream 자체는 기본적으로 이러한 종류의 버퍼링을 이미 수행합니다. 성능이 완전히 끔찍하지 않은 이유입니다. 버퍼링이 실제로 발생하는지 확인하려면 다음 링크를 참조하십시오. http://blogs.msdn.com/brada/archive/2004/04/15/114329.aspx – andreialecu

0

:

POSIX 환경에서 당신은 readv 기능을 사용하여 하나 (sys-) 호출로 파일의 여러 영역을 요청할 수 있습니다. POSIX 환경의 또 다른 조항은 논 블로킹 IO입니다.