0

C#でのプログラミング初心者です。

大きな (>1GB) テキスト ファイル (1 つの列に電圧測定値を含む) を読み込んで、MS 管理図に表示したいと考えています。

小さなファイル (〜 50 MB) では問題なく動作しますが、300 MB を超えるファイルではスタックし、大きなファイルではメモリ不足の例外が発生します。

「0.189312433308071」のように、それぞれ〜30e6の値があります。

現在、データを読み取る方法は次のとおりです。

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();

ファイルが読み込まれるまで数分待たずに、またはまったく読み込まれないようにするにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

あなたのパフォーマンスの問題は、チャートに値を追加することに完全にあると思います。メインの最初の行を使用して中程度のファイル (〜 560 mb) を作成し、それを読み取ってその値を合計しました。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 回の測定値ごとに結果の平均をバケット化したほうがよい場合があります。

于 2013-01-24T07:25:30.933 に答える