2016-07-01 3 views
-1

Google에서 몇 가지 예를 검색했지만 필요한 항목을 찾을 수 없었습니다.C# Parallel/Multithread 잠시 동안

StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt"); 

string line; 
while ((line = ImportFile.ReadLine()) != null) 
{ 
    doneTotal++; 

    string[] info = line.Split('-'); 
    string username = info.Length >= 1 ? info[0] : null; 
    string file = info.Length >= 2 ? info[1] : null; 

    myfunc(username, file); 
} 

그래서,이 myfunc는 빠른 아니지만 충분히 빨리 나를 위해 :

나는이 while 루프를 가지고있다. 루프 동안 병렬 또는 멀티 스레드를 어떻게 할 수 있습니까?

감사합니다.

+2

I/O가 얼마나 느린지 잘 알고 있습니다. 더 나은 성능을 위해 I/O를 다중 스레드 할 수 없습니다. 전체 파일을 하나의 문자열로 읽고 각 행을 개별적으로 처리하십시오. – Gus

+0

당신은 모든 줄을 읽지 못하고 병렬 foreach에서 반복 할 수 없었습니까? –

+0

@Gus & Steven 내가 사용하는 파일이 너무 커서 열 수 없으므로 큰 파일을 열 수있는 다른 방법이 없다면이 파일을 사용해야한다고 생각하십니까? – wtm

답변

1

그냥 시도해보십시오. 먼저 myfunc에 대한 매개 변수 집합을 나타내는 새 클래스를 추가합니다. (심지어 Tuple<string, string> 일 수 있습니다).

public class MyFuncParameters 
{ 
    public string UserName { get; set; } 
    public string File { get; set; } 
} 

다음과 같이 원래의 방법을 수정 즉

StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt"); 

string line; 
var filesToProcess = new List<MyFuncParameters>(); 
while ((line = ImportFile.ReadLine()) != null) 
{ 
    doneTotal++; 

    string[] info = line.Split('-'); 
    string username = info.Length >= 1 ? info[0] : null; 
    string file = info.Length >= 2 ? info[1] : null; 

    filesToProcess.Add(new MyFuncParameters {File = file, UserName = username}); 
} 

foreach (var fileToProcess in filesToProcess) 
{ 
    myfunc(fileToProcess.UserName, fileToProcess.File); 
} 

을 먼저 당신이 하나 개의 파일에서 필요한 다음 사용자가 만든 파일의 또 다른 목록 (을 반복하는 경우 모든 읽기 원본 파일에서) 다음 작업을 수행하십시오. 하나의 파일을 읽지 않고 원본 파일에 대한 다른 파일을 읽고 무언가 (myfunc)를 수행하면 성능이 향상 될 수 있습니다.

맞아요. 느린 부분이라고 말한 이후 정확히 myfunc이 무엇을하는지에 따라 달라질 수 있습니다.

주석에서 설명한대로 원하는만큼 파일을 읽을 수있는 병렬 스레드를 실행할 수 있지만 실제로는 디스크에서 실제로 읽을 수는 있습니다. 심지어 속도가 느려질 수도 있습니다.

0

나는 이것을 내 다른 대답에 게시했지만 나는 그것을 보지 못한다고 생각했다.

사용자 이름과 파일 이름이 각각 하나씩 많은 요청을 게시하는 대신 컬렉션을 게시하는 대신 서버에 게시 할 내용을 수정할 수 있습니까? 하나 또는 여러 개의 큰 요청은 많은 작은 요청보다 훨씬 빠릅니다. 각 항목은 처리하는 데 동일한 시간이 소요되지만 모든 개별 통화를 수행하는 오버 헤드는 제거됩니다.

관련 문제