2011-09-07 121 views
-1

我做了打開CSV文件,並做一些操作,包括webscrapping和獲取已鍵入長一些值的WPF應用程序。(0-10000000)內存佔用率過高的問題

現在的問題是,當大名單大約2000年被打開,那麼軟件的內存使用量在某些情況下會增加到700MB以上1G。

我很震驚地看到這一點。

有些事情我認爲是

  1. 如果csv文件的每一個條目與之相關的長期價值將需要多少memory.and單一的入口有大約10-12列各爲long類型。現在當有巨大的行數然後內存拍攝

  2. 有代碼中的某些地方有一個循環(在所有的csv行),創建一個自定義類的實例。我想有析構函數然後知道該點網自動管理內存。

在這裏不用代碼加載CSV

try 
    { 
     StreamReader sr = new StreamReader(path,Encoding.Default); 
     labelRankCheckStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate() 
     { 
      labelRankCheckStatus.Content = "Loading Data"; 
     })); 

     string strline = ""; 
     string[] _values = null; 
     int x = 0; 

     while (!sr.EndOfStream) 
     { 
      x++; 
      strline = sr.ReadLine(); 
      _values = strline.Split(','); 
      if (x == 1) 
      { 
       textBoxKw1.Text = _values[12]; 
       textBoxKw2.Text = _values[14]; 
       textBoxKw3.Text = _values[16]; 
       textBoxKw4.Text = _values[18]; 
      } 
      else if (x != 1) 
      { 
       if (_values[0] != "") 
       { 
        Url info = new Url(); 
        srNo++; 
        info.URL = idn.GetAscii(_values[0].ToString().Trim()); 
        info.IsChecked = true; 

        info.TestResults = int.Parse(_values[1].Replace("%","").TrimEnd().TrimStart()); 

        info.PageRank= int.Parse(_values[2]); 
        info.RelPageRank = int.Parse(_values[3].Replace("%","").TrimEnd().TrimStart()); 

        info.Alexa= long.Parse(_values[4]); 
        info.RelAlexa = long.Parse(_values[5].Replace("%","").TrimEnd().TrimStart()); 

        info.Links= long.Parse(_values[6]); 
        info.RelLinks = long.Parse(_values[7].Replace("%","").TrimEnd().TrimStart()); 

        info.GIW= long.Parse(_values[8]); 
        info.RelGIW = long.Parse(_values[9].Replace("%","").TrimEnd().TrimStart()); 

        info.GIN= long.Parse(_values[10]); 
        info.RelGIN = long.Parse(_values[11].Replace("%","").TrimEnd().TrimStart()); 

        info.Kw1Indexed= long.Parse(_values[12]); 
        info.RelKw1Indexed = long.Parse(_values[13].Replace("%","").TrimEnd().TrimStart()); 

        info.Kw2Indexed= long.Parse(_values[14]); 
        info.RelKw2Indexed = long.Parse(_values[15].Replace("%","").TrimEnd().TrimStart()); 

        info.Kw3Indexed= long.Parse(_values[16]); 
        info.RelKw3Indexed = long.Parse(_values[17].Replace("%","").TrimEnd().TrimStart()); 

        info.Kw4Indexed= long.Parse(_values[18]); 
        info.RelKw4Indexed = long.Parse(_values[19].Replace("%","").TrimEnd().TrimStart()); 

        info.DKwIndexed= long.Parse(_values[20]); 
        info.RelDKwIndexed = long.Parse(_values[21].Replace("%","").TrimEnd().TrimStart()); 

        info.Info= _values[22]; 

        info.srNo = srNo; 
        url.Add(info); 
       } 

      } 
      dataGrid1.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate() 
      { 
       dataGrid1.Columns[2].Header = "URL (" + url.Count + ")"; 

       try 
       { 
        if (dataGrid1.ItemsSource == null) 
         dataGrid1.ItemsSource = url; 
        else 
         dataGrid1.Items.Refresh(); 
       } 
       catch (Exception) 
       { 
       } 
       labelRankCheckStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate() 
       { 
        labelRankCheckStatus.Content = "Done"; 
       })); 
      })); 

     } 
     sr.Close(); 
     labelRankCheckStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate() 
     { 
      labelRankCheckStatus.Content = "Complete "; 
     })); 
    } 
    catch (Exception c) 
    { 
     MessageBox.Show(c.Message); 
    }` 
+1

你可以發佈你的加載csv文件的代碼嗎?也許我們可以在這裏找到一些東西 –

+3

沒有代碼和正確的數據,這是一個毫無意義的問題。除了1 GB不是真的太過分了。使用分析器找出_if_你有問題,然後它是什麼。另請參閱http://stackoverflow.com/questions/7332283 –

+0

問題在哪裏? –

回答

3

而不是建築在內存中的大型對象的副本,考慮你,並處理和輸出到流數據的功能更強大的方法你數據庫的選擇。如果您需要對舊數據執行操作,則可以使用SQL數據庫,如Sqlite。

爲系統中的每個實體創建託管對象不是浪費,你不需要大部分實體。

當然,如果你有很多RAM,它可能只是因爲內存不被任何東西主動需要,所以GC還沒有費心去收集所有的垃圾。儘管如此,你更有可能持有引用。

+0

如果您創建對象,當我們知道它的生命已經結束時,我們是否有選擇去構建 –

+0

如果這是您的意思,那麼您可以選擇在鐵把手中停止保持它。就像在你的例子中,名爲'url'的集合持有你的大對象,那麼你有兩個非確定性lambda表達式(加上main函數)持有'url'。在垃圾收集的世界中,輕量級觸摸效果最佳...... – Blindy

+2

當然,您創建的十億個半字符串也無濟於事,考慮統一這些修剪並將其替換爲單個手寫的「StringBuilder」基於功能。 – Blindy