2017-04-22 35 views
0

我有一个小型项目,我一直在为独立学习班工作一段时间。我应该为一个基于IDW的数学分析导入140,000个数据点,目前它需要大约10〜14分钟的时间来导入我所有的点。在C中实时导入数据的最佳方法#

我在做的是读取.txt文件,基于新行分割,然后根据字段之间的空格分割未来。然后将它们转换为我设计用于简单的OOD风格操作的Datapt对象。

所有我想知道的是,我可能不得不做一个现场演示与程序,我不希望人们必须坐在那里14分钟,而它预先加载,如果推动来推我可以从朋友那里找到一台笔记本电脑(我的主要功能是dekstop),并在我的演示文稿之前将其预先加载到那里,但整个问题让我想知道为什么加载只有100k的数据文件需要这么长时间?我认为这需要更短的时间?如果有比任何人都知道的更快的方法,如果你能分享它,将不胜感激!

private void openPointsToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     openFileDialog1.Filter = "Text files|*.txt|All files|*.*"; 
     openFileDialog1.Title = "Open the Captured Packets"; 
     openFileDialog1.ShowDialog(); 

     //Check to see if a filename was given 

     if (openFileDialog1.FileName != "") 
     { 
      readOut = System.IO.File.ReadAllText(openFileDialog1.FileName); 
      //textBox1.Text = System.IO.File.ReadAllText(openFileDialog1.FileName); 
      dataChain = readOut.Split(new String[] { "\r\n", "\n" }, StringSplitOptions.None); 

      //Read out Code 
      string[] link; //dataChain[0].Split(null); 



      for(int i = 0; i < 100000; i++) 
      { 
       link = dataChain[i].Split(null); 
       textBox1.AppendText(link[0] + "   " + link[1] + "   " + link[2] + "   "+ link[3] + "\r\n"); 
       dataPt Temp = new dataPt(Convert.ToDouble(link[0]), Convert.ToDouble(link[1]), Convert.ToDouble(link[2]), Convert.ToDouble(link[3])); 

       dataList.Add(Temp); 
       ptDisplay.Items.Add(Temp.ToString()); 

      } 
     } 
    } 
+1

这不是有效的代码,但ptDisplay看起来像杀手给我。不清楚它是什么,只是隐藏它,因为在代码运行时,它无论如何不会做任何有用的事情。或者完全摆脱,没有人会看十万分。 –

回答

0

想到的一个改进是,您不需要在内存中加载整个文件。您可以通过使用ReadLines方法,该方法返回一个Enumerable<string>上,您可以进一步筛选下来使用Take扩展方法的结果逐行处理它:

private void openPointsToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    openFileDialog1.Filter = "Text files|*.txt|All files|*.*"; 
    openFileDialog1.Title = "Open the Captured Packets"; 
    openFileDialog1.ShowDialog(); 

    if (openFileDialog1.FileName != "") 
    { 
     foreach (string line in System.IO.File.ReadLines(openFileDialog1.FileName).Take(100000)) 
     { 
      var link = line.Split(null); 
      textBox1.AppendText(link[0] + "   " + link[1] + "   " + link[2] + "   "+ link[3] + "\r\n"); 
      dataPt Temp = new dataPt(Convert.ToDouble(link[0]), Convert.ToDouble(link[1]), Convert.ToDouble(link[2]), Convert.ToDouble(link[3])); 
      dataList.Add(Temp); 
      ptDisplay.Items.Add(Temp.ToString()); 
     } 
    } 
} 
+0

你是对的!我不习惯使用表单来剥离打印语句,只是在列表中打印第一个和最后一个项目,以确保所有内容都能够完美无缺地工作,感谢您的参与。 –

0

不要加载文本都在内存中一次。相反,使用内部循环中的File.ReadLines枚举行并逐个处理它们,但不要在每行更改TextBox.Text也很重要。这在执行和内存占用方面都非常昂贵。 (字符串是不变的,所以在每个循环新的字符串在内存中分配和前一种是与内存碎片废弃部肆虐)

StringBuilder sb = new StringBuilder(); 
foreach(string line in File.ReadLines(openFileDialog1.FileName)) 
{ 
    link = line.Split(); 
    sb.AppendLine(link[0] + "   " + link[1] + "   " + link[2] + "   "+ link[3]); 
    dataPt Temp = new dataPt(Convert.ToDouble(link[0]), Convert.ToDouble(link[1]), Convert.ToDouble(link[2]), Convert.ToDouble(link[3])); 
    dataList.Add(Temp); 
    ptDisplay.Items.Add(Temp.ToString()); 
} 
textBox1.AppendText(sb.ToString()); 

而是每一行添加到StringBuilder class,处理好了很多的字符串拼接一起比TextBox.Text属性。然后退出循环时,只需更改TextBox.Text一次。

相关问题