나는 다음과 같은 코드가 있습니다Parallel.ForEach 루프가 성능을 향상시키는 이유는 무엇입니까?
if (!this.writeDataStore.Exists(mat))
{
BlockingCollection<ImageFile> imageFiles = new BlockingCollection<ImageFile>();
Parallel.ForEach(fileGrouping, fi => DecompressAndReadGzFile(fi, imageFiles));
this.PushIntoDb(mat, imageFiles.ToList());
}
DecompressAndReadGzFile
이 방법이 포함되어 같은 클래스의 정적 방법 내가, 예를 압축 해제 및 GZ 파일을 읽고, 그들 중 많은 오전 메소드 이름에 따라 경찰을. ~ 1000으로, 병렬화의 오버 헤드가 이점을 위해 가치가 있습니다. 그러나, 나는 이점을 보지 않고있다. ANTS 성능 프로파일 러를 사용할 때 병렬화가 발생하지 않는 것처럼 정확하게 같은 시간에 실행되고 있음을 알 수 있습니다. 또한 프로세스 탐색기에서 CPU 코어를 확인하고 두 코어에서 수행되는 작업이 있지만 한 코어가 대부분의 작업을 수행하는 것처럼 보입니다. Parallel.ForEach가 압축을 풀고 파일을 병렬로 읽는 것까지는 무엇을 이해하지 못합니까?
업데이트 된 질문 : 파일 목록에서 정보를 읽는 가장 빠른 방법은 무엇입니까?
문제점 간체 :
- 에 .gz 파일 (1200)의 큰 목록이있다.
- 각 파일에는 "DATA :"가 포함 된 줄이 있으며 위치와 줄 번호는 정적이 아니며 파일마다 다를 수 있습니다. "DATA"
- 우리는 후 첫 수를 검색합니다 (단지 단순화하기 위해) 및 (예 : 목록) 초기 질문에
메모리의 개체에 저장, 나는 병렬를 사용했다 .ForEach 루프하지만 CPU가 둘 이상의 핵심에 바인딩 된 것 같지 않았다.
'DecompressAndReadGzFile'에서 동기화가 완료 되었습니까? – SimonC
나는 알고있다. imageFiles.Add에 대한 호출이 있는데, 자동으로 이해할 수있는 잠금을 추가합니다. – Seth