문제

내가 있는 응용 프로그램을 필요가 루프를 통해 모든 라인에서 텍스트 파일 기가바이트 이상 크기에 있습니다.일부의 이 파일에 있는 10 의 100 의 수백만의 라인입니다.

예를 들어 내 현재(동기)읽기 같은 것을 보인...

  using (FileStream stream = new FileStream(args[0], FileMode.Open, FileAccess.Read, FileShare.Read)) {
    using (StreamReader streamReader = new StreamReader(stream)) {
      string line;
      while (!string.IsNullOrEmpty(line = streamReader.ReadLine())) {           
        //do stuff with the line string...
      }
    }
  }

I have read 일부에 대한 물건.Net 비동기 입출력 스트리밍 방법,그리고 난 후에 어떤 도움으로 2 에 관한 특정 질문이 이 문제를 해결합니다.

첫째,내가 받을 수 있는 성능 향상에 의해 asyncronously 읽는 경우 이러한 파일이 필요합 entireity 의 각 라인에는 ussually 짧지만,다양한 길이의(간에 관계가 없는 각 라인에서 파일)?

둘째,나는 어떻게 변환 코드 위로 비동기,읽을 수 있도록 프로세스는 각 라인에 의해-라인가?

도움이 되었습니까?

해결책

로 만드는 대신 줄을 읽는 비동기할 수 있도록 파일 읽기 비동기.는 포괄의 모든 코드에 당신의 질문에 하나의 작업자할 수 있습니다.

    static void Main(string[] args)
    {
        WorkerDelegate worker = new WorkerDelegate(Worker);
        // Used for thread and result management.
        List<IAsyncResult> results = new List<IAsyncResult>();
        List<WaitHandle> waitHandles = new List<WaitHandle>();

        foreach (string file in Directory.GetFiles(args[0], "*.txt"))
        {
            // Start a new thread.
            IAsyncResult res = worker.BeginInvoke(file, null, null);
            // Store the IAsyncResult for that thread.
            results.Add(res);
            // Store the wait handle.
            waitHandles.Add(res.AsyncWaitHandle);
        }

        // Wait for all the threads to complete.
        WaitHandle.WaitAll(waitHandles.ToArray(), -1, false); // for < .Net 2.0 SP1 Compatibility

        // Gather all the results.
        foreach (IAsyncResult res in results)
        {
            try
            {
                worker.EndInvoke(res);
                // object result = worker.EndInvoke(res); // For a worker with a result.
            }
            catch (Exception ex)
            {
                // Something happened in the thread.
            }
        }
    }

    delegate void WorkerDelegate(string fileName);
    static void Worker(string fileName)
    {
        // Your code.
        using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            using (StreamReader streamReader = new StreamReader(stream))
            {
                string line;
                while (!string.IsNullOrEmpty(line = streamReader.ReadLine()))
                {
                    //do stuff with the line string...
                }
            }
        }
    }

다른 팁

Async 패턴은 BeginRead()/endread 메().

는지 여부를 당신을 얻을 높일 의존에 많이 무엇이 다른 것에 시간에 당신을 읽습니다.다른 뭔가가 있는 앱을 할 수 있기를 기다리는 동안에 reads?그렇지 않은 경우 다음가는 비동기 많은 도움이되지 않습니다...

비동기를 읽습니다 그냥 머리 만들기 더 추구하에 대한 각 블록입니다.당신을 얻을 것이 더 나은 성능 향상에서 좋은 defrag 에 있는 파일의 파일시스템을 사용하여 동시 읽습니다.

로 이미 지적,전달하는 라인이 처리하여 다른 스레드를 제공해야 후원(특히 multi-core Cpu)

면 성능이 매우 중요한 권하고 싶 조사에 대한 interop FILE_FLAG_SEQUENTIAL_SCAN여기에 세부 사항

더 나은 아직도 쓸 작은 C++응용 프로그램를 검사를 통해 파일에는 플래그를 보면 그것은 성능을 향상시킵니다.

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