문제

3.7GB 파일에서 작은 데이터 시퀀스를 읽어야합니다. 내가 읽어야 할 위치는입니다 인접하지 않습니다, 그러나 파일을 처음부터 끝까지 읽도록 IO를 주문할 수 있습니다.

파일은 ISCSI SAN에 저장되어 대기열 IO를 처리/최적화 할 수 있습니다.

문제는 한 번에 필요한 모든 데이터/위치에 대해 어떻게 한 번의 요청을 할 수 있습니까? 가능합니까? 읽기가 매우 작기 때문에 Async IO가 옵션이라고 생각하지 않습니다 (20-200 바이트)

현재 코드는 다음과 같습니다.

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);

    }
    ...
}

나는이 I/O를 개선 할 수있는 방법을 찾고 있습니다. 머리를 움직이는 모든 추구 시간이 더해지는 것 같습니다.

도움이 되었습니까?

해결책

당신은 달리 셨나요? 퍼포먼스 모니터 (Microsoft sysinternals에서) 이것에 대해?

문제가 무엇인지 잘 모르겠지만 추측 할 것입니다. SAN에서 읽고 있다면 디스크 액세스가 후드 아래 네트워크 요청이 발생한다고 생각합니다. 첫 번째 읽기는 데이터를 찾고 읽고 버퍼링하도록 요청을 보내고 Serializer가 객체를 구성합니다. 두 번째 요청이 전송되면 SAN 디스크가 계속 회전하므로 데이터가 제자리에 제자리에있을 때까지 기다려야합니다.

멀티 스레딩을 시도해 보셨습니까? 순차적 순서로 처리 해야하는 파일 섹션 대기열을 설정하고 일부 스레드를 회전시키고 파일을 개별적으로 열도록하십시오 (파일에 한 번에 파일에 액세스 할 수 있도록 파일을 읽을 수 있도록 파일을 읽으십시오). 그런 다음 대기열에서 작업을 잡기 시작하십시오. 결과를 다른 컬렉션으로 출력하십시오. 주문이 출력의 문제가 발생하면 출력을 대기 한 원래 순서별로 정렬합니다.

--- 편집하다 ---

당신은 시도 했습니까? readfilescatter API? 다음은 pinvoke.net의 p-invoke 서명입니다.

다른 팁

을 만들다 하나의 디스크 프록시로 배경 스레드. 모든 읽기 작업을 보내고 읽기를 정렬하고 병합하십시오. 둘 이상의 영역이 가까운 경우 포함 된 전체 섹터를 읽고 데이터의 하위 섹션을 가져갑니다. 데이터를 비동기로 반환하십시오.

기록만을 위해서:

POSIX 환경에서는 하나 (sys-) 호출을 사용하여 파일의 여러 영역을 요청할 수 있습니다. readv 기능. Posix 환경의 또 다른 션은 비 차단 IO입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top