2012-01-02 3 views
3

어제 나는 how do disable disk cache in c# invoke win32 CreateFile api with FILE_FLAG_NO_BUFFERING에서 질문을했다. 내 성능 테스트 쇼에서작은 파일을 여러 개 읽는 속도와 성능을 향상시키는 방법

(쓰기 및 테스트, 1000 개 파일 및 전체 크기 220M를 읽기)의 FILE_FLAG_NO_BUFFERING 난에 수 FILE_FLAG_SEQUENTIAL_SCAN에 변화 FILE_FLAG_NO_BUFFERING 시도 이후 나, .NET 기본 디스크 캐시보다 성능과 낮은을 향상시킬 수 없습니다 .net 기본 디스크 캐시에 도달하고 더 빠릅니다.

전에 mongodb의 gridfs 기능을 사용해보십시오. Windows 파일 시스템을 바꾸고, 좋지 않습니다 (분산 기능을 사용하지 않아도됩니다.).

내 제품의 경우 서버는 TCP/IP를 통해 초당 많은 작은 파일 (60-100k)을 얻을 수 있으며 디스크에 저장해야하며 세 번째 서비스는이 파일을 한 번 읽습니다 (단지 한 번 읽음). 및 프로세스) .if 내가 비동기 I/O를 사용할지 여부를 도울 수 있는지 여부를 최고의 속도와 최고의 낮은 CPU주기를 얻을 수 있습니다.? 누군가 제안을 할 수 있습니까? 아니면 여전히 FileStream 클래스를 사용할 수 있습니까?

모든 파일을 하나 개의 큰 파일 이상으로 작성하고 그것을 읽고 1 캔 내 demand.that를 달성할지 여부를

메모리 매핑 된 파일 갱신?

buggest 상당한 개선의
+0

한 번만 처리하면 이러한 파일을 디스크에 기록해야합니까? –

+1

그냥 질문에 가서 anwes 옆에있는 "오른쪽 화살표"를 확인하여 작업을 달성하는 데 도움이 된 답변을 표시하십시오. :-) –

+1

@ Pankaj Upadhyay, 고맙습니다, 해결했습니다 .i는 메모 할 것입니다. – springchun

답변

2

100kB 파일을 디스크에 쓰는 데 5-10 초가 걸리면 세계에서 가장 오래된 PC 중 가장 느리고 가장 느린 PC를 사용하거나 코드가 매우 비효율적 인 작업을 수행하고있는 것입니다.

디스크 캐싱을 끄면 상황이 나아질 수 있습니다. 디스크 캐시가 있으면 쓰기가 빨라지고 Windows는 나중에 데이터를 디스크로 플러시하는 느린 부분을 수행합니다. 실제로 I/O 버퍼링이 증가하면 일반적으로 I/O가 크게 향상됩니다.

확실히 비동기 쓰기를 사용하고 싶습니다. 즉, 서버가 데이터 쓰기를 시작한 다음 OS가 백그라운드에서 디스크에 데이터를 쓰는 동안 고객의 응답으로 되돌아갑니다.

(디스크 캐싱을 사용하는 경우 OS가 이미 수행하고 있으므로) 쓰기를 대기열에 넣을 필요는 없지만 다른 모든 것이 실패하면 시도 할 수 있습니다. 쓰기 만하면 도움이 될 수 있습니다. 디스크 검색의 필요성을 최소화하기 위해 한 번에 한 파일 씩.

일반적으로 I/O의 경우 더 큰 버퍼를 사용하면 처리량이 증가합니다. 예를 들어 루프의 파일에 각 개별 바이트를 쓰는 대신, 하나의 쓰기 작업에서 버퍼 - 전체 데이터 (이상 적으로 언급 한 크기의 전체 파일)를 작성하십시오. 이렇게하면 오버 헤드가 최소화됩니다 (모든 바이트에 대한 쓰기 함수를 호출하는 대신 전체 파일에 대해 한 번 함수를 호출합니다). 나는 당신이 당신이 얻고 있다고 제안한 수준으로 성능을 떨어 뜨리는 것을 알고있는 유일한 방법이기 때문에 당신이 이것과 같은 것을 할 것 같다고 생각합니다.

메모리 맵 파일은 도움이되지 않습니다. 대용량 파일의 내용에 액세스하는 데 가장 좋습니다.

+0

안녕하세요, @ Jason Williams, 제안 해 주셔서 감사합니다. 고마워. 어떻게해야하는지 알려줘. 고마워. – springchun

1

하나는, 귀하의 경우, 프로세스 FILLES 없이 당신이 정말로, 저장할 Queue에 그들을 밀어 그것을 provess해야하는 경우, 디스크와 후에 저장, IMO가 될 수 있습니다 다른 스레드는 디스크에 저장합니다. 이렇게하면 디스크에 데이터를 저장하는 시간을 낭비하지 않고 필요한 처리 된 데이터를 즉시 얻을 수 있으며 file processor의 계산 능력을 잃지 않고도 디스크에 파일을 저장할 수 있습니다.

+0

안녕하세요, @ Tigran, 또한 Queue.but를 사용하기 전에, 클라이언트가 멀티 스레드에서 두 번째로 20-30 파일을 보내고, 서버 프로세스 하나의 파일은 많은 파일이 메모리에 보관되는 경우 5-10 초가 경과해야합니다. memoryleak 예외를 throw합니다. – springchun

+0

한 곳에서 디스크로 저장하고 큐에서 제거하는 다른 스레드의'queue'에로드 할 수 있습니다. ALL을 채우지 않고 처리 한 후 실행 중에 처리하십시오. – Tigran

관련 문제