2011-09-07 120 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