【发布时间】:2016-11-14 21:21:39
【问题描述】:
我使用 C# 将文本文件中的数据读取到 2D 列表中以进行进一步处理。每个文件有 256 个双精度,空间分隔为 256 行,每一行都被读入一个双精度列表,每个列表都被添加到一个行列表中。所有文件都有 256x256 = 65,536 个数据点。
我的代码可以读取文件并且对某些文件运行良好,但对于其他文件则需要很长时间。由于所有文件都以相同的方式格式化并包含相同数量的数据点,我不明白读取时间的差异,有人有什么想法吗?
如何加快文件 2 的读取时间?
这是我正在使用的代码:
private Data ReadData (string name, string file)
{
List<List<Double>> data_points = new List<List<Double>>();
String input = File.ReadAllText( file );
foreach (string row in input.Split('\n'))
{
List<Double> line_list = new List<double>();
foreach (string col in row.Trim().Split(' '))
{
if(row != "")
{
line_list.Add(double.Parse(col.Trim()));
}
}
if(line_list.Count > 1)
{
data_points.Add(line_list);
}
}
Data temp_data = new Data(name, data_points);
return temp_data;
}
示例文本文件在这里:
https://www.dropbox.com/s/diindi2qjlgoxep/FOV2_t1.txt?dl=0 => 读取速度很快
https://www.dropbox.com/s/4xrgdz0nq24ypz8/FOV2_t2.txt?dl=0 => 读取速度很慢
对一些 cmets 的回答: @AntDC - 什么是有效的替身?我尝试用 Convert.ToDouble 替换 Parse.Double 没有任何改进。
@Henk Holterman - 读取时间的差异非常明显,对于第一个文件
@Slai - 我将两个文件都移到了其他位置,这对读取时间没有影响。这两个文件都是在几秒钟内从同一个程序中导出的。
【问题讨论】:
-
你的所有值都是有效的双精度值吗? Double.Parse 对于无效的双打可能会很慢。
-
指定“很长一段时间”。关于其他情况。这是可重复的吗?您如何衡量,您采取了哪些措施来消除 GC 和 I/O 伪影?
-
文件似乎是碎片化的,这意味着文件分布在硬盘的多个部分,而不仅仅是一个连续的区域。您可以运行磁盘碎片整理程序,或将文件复制到新位置。
-
我无法重现差异。在 VS 2015 中,这两个文件在大约 0.1 秒内完成,您的代码位于
Data行之前。是否有任何文件在共享文件夹中,或者在Data类构造函数中是否有任何相关内容? -
Slai 你是对的,问题不是读取文件部分,而是 Data 类构造函数在第二种情况下花费的时间要长得多。谢谢大家的回复。
标签: c# double string-parsing