0

我是 C# 编程的初学者。

我想读取大型 (>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();

如何在不等待几分钟加载文件或根本不加载的情况下成功地做到这一点?

谢谢。

4

1 回答 1

1

我认为您的性能问题完全在于为您的图表添加值。我使用 main 的第一行创建了一个中等大小的文件(~560mb),然后读取它并将其值相加。花了不到一分钟。

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 回答