2009-06-18 3 views
0

stringdictionary를 텍스트 파일로 내보내려고하는데 레코드가 100 만 개가 넘습니다. 루프를 사용하면 텍스트 파일로 내보내는 데 3 분 이상이 걸립니다.StringDictionary To TextFile

더 빠른 방법이 있습니까?

감사

+0

더 많은 정보가 필요합니다 .... –

+1

지금 사용하는 내보내기 방법은 무엇입니까? – Steef

+3

일부 코드는 게시하는 것이 좋습니다. 사람들이 그런 식으로 문제를 쉽게 볼 수 있습니다. – Mark

답변

4

글쎄, 당신이 수출을 위해 사용중인 형식에 따라 다르지만 일반적으로 많은 양의 데이터를 내보내기위한 가장 큰 오버 헤드는 I/O가 될 것입니다. 가능하면 압축 된 데이터 형식을 사용하고 메모리의 데이터를 덜 조작하여 (메모리 복사본을 방지)이 문제를 줄일 수 있습니다.

먼저 디스크 I/O 속도를 확인하고 쓰기를 수행하는 코드의 프로파일 링을 수행하십시오.

디스크 I/O를 최대화하려면 (예 : 최신 시스템에서 초당 수십 메가 바이트의 디스크 속도를 사용하여 쓰기), 데이터 압축을 고려할 수 있습니다 그것을 써라. 이렇게하면 더 많은 CPU가 사용되지만 이렇게하면 디스크에 쓸 내용이 적어집니다. 또한 읽기 측면에서 동일한 병목 현상이있는 경우 파일 읽기 속도가 빨라질 수 있습니다.

CPU를 최대한 활용하려면 데이터를 작성하기 전에 데이터 처리 작업을 줄여야합니다. 예를 들어 직렬화 라이브러리를 사용하는 경우이를 피하고보다 단순하고보다 특수화 된 데이터 형식으로 전환하는 것이 도움이 될 수 있습니다. 가장 간단한 형식을 고려하십시오. 아마도 문자열의 길이에 대한 단어, 문자열 데이터 자체, 모든 키와 값에 대해 반복됩니다.

+0

"예를 들어 직렬화 라이브러리를 사용하는 경우이를 피하고 더 단순하고보다 특수화 된 데이터 형식으로 전환하는 것이 도움이 될 수 있습니다." - 또는 더 빠른 직렬화 라이브러리 사용; –

3

대부분의 사전 구조는 삽입 순서를 유지하지 않으므로 반복되는 파일 내용을 원할 경우 빈약 한 선택이 될 수 있지만 (크기에 따라) 우리는 시간을 개선 할 수 있습니다. 이 (아래) 단지 30메가바이트에서 쓰는 약 3.5 초 (수출을 위해) 취

StringDictionary data = new StringDictionary(); 
    Random rand = new Random(123456); 
    for (int i = 0; i < 1000000; i++) 
    { 
     data.Add("Key " + i, "Value = " + rand.Next()); 
    } 
    Stopwatch watch = Stopwatch.StartNew(); 
    using (TextWriter output = File.CreateText("foo.txt")) 
    { 
     foreach (DictionaryEntry pair in data) 
     { 
      output.Write((string)pair.Key); 
      output.Write('\t'); 
      output.WriteLine((string)pair.Value); 
     } 
     output.Close(); 
    } 
    watch.Stop(); 

는 분명히 성능이 실제 데이터가 기록하기의 크기에 따라 달라집니다.