【问题标题】:Read double data from a text file - differences in read time从文本文件中读取双重数据 - 读取时间的差异
【发布时间】: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


【解决方案1】:

在性能方面,您可以优化您的代码,而不是读取整个文件,然后将其拆分。逐行阅读。

List<Double> line_list = new List<double>();
foreach (string line in File.ReadLines("c:\\file.txt"))
{
    string[] rows = line.Trim().Split(' ');

    foreach(string el in rows)
    {
        line_list.Add(double.Parse(el.Trim()));
    }
}

【讨论】:

  • 谢谢我后来在类构造函数中发现了问题,但我也实现了这个更改以提高性能。
猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多