2013-09-21 45 views
1

我最近遇到了一個關於我的程序使用的內存的問題。原因是在方法中使用的字符串數組的內存。更具體地說,這個程序是從外部文件中讀取一個整數數組。這裏是我的代碼方法C中的本地字符串數組的空閒內存#

class Program 
{ 

    static void Main(string[] args) 
    { 
     int[] a = loadData(); 
     for (int i = 0; i < a.Length; i++) 
     { 
      Console.WriteLine(a[i]); 
     } 
     Console.ReadKey(); 
    } 

    private static int[] loadData() 
    { 
     string[] lines = System.IO.File.ReadAllLines(@"F:\data.txt"); 
     int[] a = new int[lines.Length]; 
     for (int i = 0; i < lines.Length; i++) 
     { 
      string[] temp = lines[i].Split(new char[]{','},StringSplitOptions.RemoveEmptyEntries); 
      a[i] = Convert.ToInt32(temp[0]); 
     } 
     return a; 
    } 
} 

文件data.txt約爲7.4 MB和574285行。但是當我運行時,任務管理器中顯示的程序的內存是:41.6 MB。看來,在loadData()(它是字符串[]行)中讀取的字符串數組的內存不會被釋放。我怎樣才能釋放它,因爲它以後不會被使用。

+0

當垃圾收集器運行時,該內存將自動釋放。此外,您無法確定垃圾收集器何時會實際運行。你不需要擔心它。 –

回答

1

將行設置爲null後可以調用GC.Collect(),但我建議您查看所有答案hereherehere。調用GC.Collect()是你很少想要做的事情。使用C#等語言的目的是爲您管理內存。如果你想對讀入的內存進行細化控制,那麼你可以創建一個C++ dll並從你的C#代碼中調用它。

而不是將整個文件讀取到字符串數組中,您可以逐行讀取它並在該行上執行所需的操作。這可能會更有效率。

使用的內存40MB會導致什麼問題?你多久閱讀一次數據?是否值得將其緩存以供將來使用(假設7MB是可以容忍的)。

+0

我只使用它一次。 – khaimaitien

+0

@khaimaitien爲什麼不按行讀取文件,然後根據需要進行操作,而不是讀入字符串數組以開始?您可以將int []更改爲列表,該列表將更高效並預先使用更少的內存。當然它仍然取決於GC何時釋放內存。 – acarlon

+0

這只是一個例子,在我真正的程序中我使用Dictionary類來保存一對字符串和整數。由於速度,鼓勵使用具有已知容量的Dictionay。 – khaimaitien