0

データを前処理するためのアルゴリズムがあります。*.arff フォーマットで動作します。アルフフィレス。私は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;
             }
          }
       }
    }
4

1 に答える 1

0
  1. クラス BufferedStream を試すことができます。これは、IStream のバッファリングされた実装です。
  2. コードの一部を最適化できます。いくつかの値を事前評価する、つまりdouble.Parse(data[j])
  3. また、文字列を一度だけスキャンする手動メソッド string.Contains(char[] chrToSeek) を書くこともできます。
于 2013-04-09T17:18:09.473 に答える