最好的方式来访问超过100万个数字c#
本文关键字:100万 数字 访问 方式 | 更新日期: 2023-09-27 18:18:51
所以问题是:我有一个带*的文件。extesnion奉养。该文件包含大约94列和24500行数字,可以作为普通文本文件读取。从程序中访问这些数字的最佳方法是什么?例如,我希望第15列中的所有数字都以双精度存储。我有什么选择?我尝试过数据表,但加载整个文件与文件。ReadAllLines需要大约150MB的RAM内存来运行程序,我必须考虑到程序将使用多个这样的文件。那块*。SLD文件看起来像这样:
0.000 96.47 2.51 1.43 2.56 2.47 5.83 -> more columns
1.030 96.47 2.52 1.39 3.14 2.43 5.60 |
2.044 96.47 2.43 1.63 2.96 2.34 5.86 '/
3.058 96.47 2.47 0.76 2.59 2.44 5.62 more rows
4.072 96.47 2.56 1.39 2.99 2.38 5.89
除了前面提到的更多的列和行。我的解决方案是这样的:
//Read all lines of opened file to string array
string[] lines = System.IO.File.ReadAllLines(@OFD.FileName,Encoding.Default);
//Remove more than one whitespace with only one whitespace in cycle (cycle not shown)
string partialLine = Regex.Replace(lines[i], @"'s+", " ");
//Split string to string array and add it to dataTable
string[] partialLineElement = partialLine.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);
fileData.Rows.Add(partialLineElement);
但是我有问题访问整个数据列,它是一个字符串数组,而不是双数字。我需要它将这个文件的一列添加到ZedGraph作为double[]。我还尝试将此数据表分配给dataGridView为:
dataGridView1.DataSource = fileData;
dataGridView1.Refresh();
但是如何访问双列[]??有什么建议吗?
但是如何访问双列[]??有什么建议吗?
您可以使用File.ReadLines
,它不会将整个文件加载到内存中。
ReadLines和ReadAllLines方法的区别如下:当使用ReadLines方法时,可以在返回整个集合之前开始枚举字符串集合;当您使用ReadAllLines时,您必须等待整个字符串数组返回,然后才能访问该数组。因此,当您处理非常大的文件时,ReadLines可以更有效。
double[] col4 = File.ReadLines(filename)
.Select(line => line.Split(new char[]{' '},StringSplitOptions.RemoveEmptyEntries))
.Select(p => double.Parse(p[4],CultureInfo.InvariantCulture))
.ToArray();
获取所有列
double[][] allCols = File.ReadLines(filename)
.Select(line => line.Split(new char[]{' '},StringSplitOptions.RemoveEmptyEntries))
.Select(p => p.Select(s => double.Parse(s, CultureInfo.InvariantCulture)).ToArray())
.ToArray();
我过去曾使用StreamReader从示例文件导入大约30,000行,将每行解析为30个不同的单元格,并使用它导入到数据库中。读取和解析只需要几秒钟。你可以试试。只是要确保在using语句中使用它。
至于解析第15列,我想不出比写一个函数更好的方法了。