我是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();
如何在不等待几分钟文件加载或根本不加载的情况下成功执行此操作?
谢谢。
我认为您的性能问题完全在于向图表添加值。我使用 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 个读数的结果平均值进行分类。