如何在C#中更快地进行数据读取和预处理

时间:2013-04-09 16:56:36

标签: c# multithreading

我有一个预处理数据的算法。它使用* .arff格式。 arff filles。我有一个class属性,我有arff文件的结构。在字符串中,我记录了属性的名称,可以采用的值及其出现次数。在数值中,我记录最小最大平均值和标准偏差。对于小文件,它工作得很好,但对于大文件,它非常慢。该文件可以超过10 GB。

我尝试了很多选项 - MemoryMapped Filles,BufferedStream。我认为问题在于长时间的预处理,但我不知道如何让它更快。 我尝试了线程,但我不知道如何。

private void readDataArff()
{
   string line = "";
   using (StreamReader file = new StreamReader(openFileDialog1.FileName))
   {
      string[] data;
      while ((line = file.ReadLine()) != null)
      {
         if ((line.Contains('%')) || (line.Contains('@')) || (line.Contains("") && (!line.Contains(','))))
         continue; //skip header

         data = line.Split(',');

         for (int j = 0; j < attrList.Count; j++)// 
         {
            attrList[j].FilePath = openFileDialog1.FileName;
            attrList[j].Index = j;
            if (attrList[j].Type1 == "STRING")
            {
               foreach (var item in attrList[j].Values)
               {
                  if (item.Name == data[j])
                  {
                     item.Count += 1;
                     break;
                  }
               }
            }
            else if ((attrList[j].Type1 == "REAL" && (line != "") && (!line.Contains('@'))) ||
              (attrList[j].Type1 == "REAL" && (line != "") && (!line.Contains('@'))))
            {
               if ((data[j] == "?") || (data[j] == "") || (data[j] == " "))
               continue;
               attrList[j].Count += 1;
               attrList[j].Sum = double.Parse(data[j]) + attrList[j].Sum;
               double tmp = double.Parse(data[j]);
               if (attrList[j].Max < tmp)
                  attrList[j].Max = tmp;
               if (attrList[j].Min > tmp)
                  attrList[j].Min = tmp;
             }
          }
       }
    }

1 个答案:

答案 0 :(得分:0)

  1. 你可以尝试类BufferedStream,它是IStream的缓冲实现。
  2. 您可以优化部分代码。预先评估一些值,即double.Parse(data[j])
  3. 您也可以编写手动方法string.Contains(char [] chrToSeek),只扫描一次字符串。