2012-10-09 87 views
-3

我有一個要求複製文件,解析它的內容刪除換行符,並沿着管道拆分內容,然後將結果字符串[]關閉存儲在數據庫中。我的文件每個文件最多可以有65000條有效記錄,因此性能至關重要。在C#中讀取文件的優化#

下面是我目前有。問題是非常緩慢(處理65000行3小時)。我會很感激任何幫助改善優化這件作品,所以我的跑步可以更快。

public void ReadFileLinesIntoRows() 
    { 
     try 
     { 
      using (var reader = new TextFieldParser(FileName)) 
      { 
       reader.HasFieldsEnclosedInQuotes = false; 
       reader.TextFieldType = FieldType.Delimited; 
       reader.SetDelimiters("|"); 
       String[] currentRow; 
       while (!reader.EndOfData) 
       { 
        try 
        { 
         currentRow = reader.ReadFields(); 
         int rowcount = currentRow.Count(); 
         //if it is less than what you need, pad it. 
         if (rowcount < 190) 
         { 
          Array.Resize<string>(ref currentRow, 190); 
          rows.Add(currentRow); 
         } 
         else 
         { 
          rows.Add(currentRow); 
         } 
        } 
        catch (MalformedLineException mex) 
        { 
         unreadlines.Add(reader.ErrorLine);//continue afterwards 
        } 
       } 
       this.TotalRowCount = rows.Count(); 
      } 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 
    } 

    public void cleanfilecontent(String tempfilename, Boolean? HeaderIncluded) 
    { 
     try 
     { 
      //remove the empty lines in the file 
      using (var sr = new StreamReader(tempfilename)) 
      { 
       // Write new file 
       using (var sw = new StreamWriter(CleanedCopy)) 
       { 
        using (var smove = new StreamWriter(duptempfileremove)) 
        { 
         string line; 

         Boolean skippedheader = false; 
         while ((line = sr.ReadLine()) != null) 
         { 
          // Look for text to remove 
          if (line.Contains("----------------------------------")) 
          { 
           smove.Write(line); 
          } 
          else if (HeaderIncluded.HasValue && HeaderIncluded.Value==true && ! skippedheader) 
          { 
           smove.Write(line); 
           skippedheader = true; 
          } 
          else if(skippedheader) 
          { 
           // Keep lines that does not match 
           sw.WriteLine(line); 
          } 
         } 
         smove.Flush(); 
        } 
        sw.Flush(); 
       } 
       sr.Close(); 
      } 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 

    } 
+4

那麼問題是什麼? – zerkms

+0

你的'TextFieldParser'看起來像什麼? –

+0

TextFieldParser lib在Microsoft.VisualBasic.FileIO – Kobojunkie

回答

0

65000記錄並不是那麼大。如果您有足夠的內存,我會建議將整個文件讀到內存中,執行解析並構建行,並使用批量插入將數據提交給數據庫。這將是最快的!我懷疑你的3個小時中的大部分時間都花費在一次將數據庫記錄插入到數據庫中。

+0

這就是我現在正在工作,它真的很慢。我試圖找到優化閱讀和解析方面的方法,如果可能的話也可能是數據庫方面。 – Kobojunkie

+0

在EF或數據適配器中調用單一提交/提交方法並不等同於單個批處理插入。在通常情況下,這是作爲多個單一插入語句執行的,這會導致您的性能下降。看看這個http://www.codeproject.com/Articles/354094/Bulk-Insert-in-NET-applications-Part-1 –

+1

你應該至少調試一下,找出瓶頸所在。是在加載/讀取文件還是在提交記錄時 –