2013-01-24 2 views
0

저는 C# 프로그래밍의 초보자입니다.C에서 MS 차트 컨트롤 시리즈로 파일에서 큰 데이터를 읽는 방법

대용량 (> 1GB) 텍스트 파일 (하나의 열에 전압 판독 값 포함)을 읽고 MS 제어도에 표시하고 싶습니다.

작은 파일 (~ 50MB)에서는 정상적으로 작동하지만 300MB보다 큰 파일에는 걸리지 않으며 더 큰 파일에 대해서는 메모리 부족 예외가 발생합니다.

이 값은 ~ 30e6 값이 각각 "0.189312433308071"과 같습니다.

은 여기 어떻게 지금 데이터를 읽어 메신저 :

System.IO.StreamReader sr = new 
System.IO.StreamReader(openFileDialog1.FileName); 
string line; 

int pointIndex = 0; 


while ((line = sr.ReadLine()) != null) 

{ 
    dataVoltage.Add(line); 
    chart1.Series["Default"].Points.AddXY(pointIndex, Convert.ToDouble(line)); 
    pointIndex=pointIndex+1; 

    } 

sr.Close(); 

어떻게 성공적으로로드 또는 전혀로드하지 않는 파일에 대한 분을 기다리지 않고이 작업을 수행 할 수 있습니까?

감사합니다.

답변

1

성능 문제는 전적으로 차트에 값을 추가하는 것이라고 생각합니다. 나는 메인의 첫 번째 줄을 사용하여 중간면 파일 (~ 560MB)을 만든 다음 그것을 읽고 값을 합산했다. 1 분도 안 남았습니다. 차트는 유지해야하므로 많은 값은 많은 메모리를 먹을 것을 들고,이를 개최 할 수있는 권리 곳이면

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace LargeReadWrite 
{ 
    class Program 
    { 
     const string fileName = "D:\\PersonalDev\\stackoverflow\\largefile.txt"; 
     static void Main(string[] args) 
     { 
      CreateLargeFile(); 
      ReadLargeFile(); 
     } 

     static void CreateLargeFile() 
     { 
      Random r = new Random(); 
      using (StreamWriter sw = new StreamWriter(fileName)) 
      { 
       for (uint i = 0; i < 30000000; i++) 
       { 
        sw.WriteLine(r.NextDouble()); 
       } 
      } 
     } 

     static void ReadLargeFile() 
     { 
      using (StreamReader sr = new StreamReader(fileName)) 
      { 
       double total = 0.0; 
       while (sr.Peek() >= 0) 
       { 
        total += Double.Parse(sr.ReadLine()); 
       } 
       Console.WriteLine(total); 
      } 
     } 
    } 
} 

실행 일부 성능 프로파일 링 도구와 결정. n 개의 판독 값마다 결과의 평균을 버킷 화하는 것이 좋습니다.

+0

의견을 보내 주셔서 감사합니다. 실제로 응용 프로그램은 차트에 정확한 값을 표시해야합니다. 내가 염두에두고있는 점은 처음에 각각의 n 값을 평균적으로 표시한다는 것입니다. 그러나 사용자가 특정 영역을 확대하면 응용 프로그램은 해당 기간의 정확한 값을 추가해야하며 사용자가 축소 할 때 이전 평균값을 표시해야합니다. 하지만 난 그렇게 할 수 있다고 생각하지 않는다. 너무 복잡해 보인다. – Xichan

+0

그렇게 복잡하지는 않습니다. 사실 가치를 버킷으로 올리는 경우 확대/축소가 집중하는 버킷을 결정한 다음 해당 버킷을 리베 케팅 할 수 있습니다. 여전히 많은 양의 메모리를 사용하고 있지만, 시스템이 값을 읽거나로드하려고 시도해서는 안됩니다. 확대/축소가 원하는 데이터를 표시하기에 충분하기 전에 평균 주위에 위 아래 막대를 추가로 배치 할 수 있습니다. 그러나, 그러한 종류의 디스플레이를위한 것이 아닌 오브젝트에 3 천만 개의 개별 점을 표시하는 것은 효과가 없습니다. – Tawnos

관련 문제