2010-06-29 4 views
1

구문 분석 할 수있는 큰 이진 파일이 있고 성능을 향상시키기 위해 사용할 언어가 확실하지 않습니다. 처음에는 GUI로 C# WPF를 사용하고 파싱에는 C DLL을 사용할 것입니다. 하지만 내 타겟 PC는 64 비트 머신이다. 그리고 나는 VS 2008에서 C DLL 프로젝트를 설정하는 데 어려움이있었습니다. 그래서 만약 내가 C++이나 C#으로 파싱을해야한다면 생각하고 있습니다. 나는 C++/C#의 파일 읽기 속도가 확실하지 않다. 내 파일이 꽤 크기 때문이다. 속도는 매우 중요합니다. 아무도 나에게 제안을 줄 수 있니? 덕분에 .이진 파일 구문 분석 : 성능

+0

언어가 거의 비슷하지 않습니다. –

+1

... 불필요한/조숙 한 최적화라고합니다. –

+0

나열된 모든 언어가 파일 입출력을 수행하기 위해 OS를 호출한다고 생각하십시오. –

답변

3

언어에 중점을 두지 않고 (다른 사람들이 언급 한 것처럼 효과가 거의 없음), 접근법에 중점을 둡니다.

일반적으로 파일 매핑 (.NET 4.0의 새로운 MemoryMappedFile 클래스에서 사용 가능)을 사용하는 것이 좋습니다. 이것은 일반 패스를 사용하여 수행 할 수있는 단일 패스, 전진 전용 검색을 수행하지 않는 한 좋습니다.

관리되지 않는 코드가 .NET에 노출되지 않은 파일 열기 루틴 (특히 파일을 임의 또는 순차적으로 액세스하려고한다고 캐시 관리자에게 알리는)에 전달할 수 있다는 힌트가 있습니다. 그러나 이러한 기능이 부족하면 성능에 큰 영향을 미치지 않을 것입니다.

3

나머지 프로그램을 쓰는 언어를 선택하십시오. 파일 스트림을 실행하고 빨판을 읽으십시오.

사용하는 코드에 관계없이 데이터가있는 곳으로 가려고 디스크를 기다리는 중일 것입니다.

0

Windows의 생명은 우수 플랫폼 덕분에 다른 플랫폼보다 약간 간단합니다. Overlapped IO API. 실제로 성능을 높이려는 경우 사용하려는 것입니다. 겹친 IO는 IO가 순서가 틀리게되는 것을 허용합니다. 실제로 FileStream은 두드리기에서 중복 된 IO를 사용한다는 것을 알 수 있습니다. 그 한계 내에서 일할 수 있다면 그냥 사용하십시오. 그렇지 않으면 관리되는 C++ 래퍼를 만들어 ReadFile을 사용하여 읽을 수 있습니다.

이 방법이 올바른 이유는 디스크 IO가 프로그램에서 가장 느린 부분이어야한다는 것입니다. 겹쳐진 입출력을 사용하면 디스크에 액세스하는 다른 방법이 없다면 처리량에 대한 디스크의 실제 한계에 근접 할 수 있어야합니다. 데이터 구조로의 디코딩은 간단해야합니다. 그렇지 않은 경우 데이터를 파싱하는 방법을 다시 검토해야합니다.

+0

오버랩 된 입출력이 좋다는 점에 동의하지만 (파일 매핑의 두 번째) 겹쳐진 'FileStream'을 얻으려면 부울 async 매개 변수를 사용하고'true '를 전달하는 생성자 중 하나를 사용해야합니다. 'File.Open', et. al. 중첩 된 I/O를 사용하지 마십시오. –

+0

내가 아는 사람들에게 물어 보겠다.하지만 mem 매핑 된 파일이 중복 된 I/O를 사용하고있는 것 같다. –

+0

아니오; 메모리 매핑 된 파일은 매우 다른 접근 방식입니다. [Windows Internals] (http://tinyurl.com/23seaj8)에는 다양한 I/O 메소드의 작동 방식에 대한 훌륭한 설명이 있습니다. –