![](/img/trans.png)
[英]OutofMemoryException while reading large XML file in C# windows forms
[英]OutOfMemoryException while reading a file
在我的應用程序中,我正在使用Windows服務讀取文件。 該服務每秒讀取一次文件。 這是我用來讀取文件的代碼:
public static byte[] GetBytesFromFile(string fullFilePath)
{
FileStream fs = File.OpenRead(fullFilePath);
try
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, Convert.ToInt32(fs.Length));
fs.Close();
return bytes;
}
finally
{
fs.Close();
}
}
幾個小時后,我得到了System.OutOfMemoryException
。 我在這里做錯什么嗎?
更新:我在此代碼中使用返回的字節:
object s = null;
System.Reflection.Assembly a = Assembly.Load(bytes);
object o = a.CreateInstance("ID_" + report.ID.ToString().Replace("-", "_"));
Type t = o.GetType();
MethodInfo mi = t.GetMethod(name);
object[] values = new object[1];
values[0] = nameValue;
s = mi.Invoke(o, values);
return s;
通過編輯,問題很明顯:
System.Reflection.Assembly a = Assembly.Load(bytes);
事情是這樣的:程序集不會從AppDomain
卸載 。 有一些垃圾可收集的東西,例如DynamicMethod
但不是完整的程序集。 如果要加載程序集,則唯一安全的方法是在過程中將其放入單獨的AppDomain
中。 然后,您可以在使用完AppDomain
拋棄它(卸載其中的所有內容)。
實際上,不能保證您現有的代碼也能正常工作 - Read
並不能保證讀取所有數據。 我有關於此的待定博客文章...
但是:如果文件很大,則可能是慢慢使LOH飽和,這是一個非緊湊的堆。 我能提供的最佳建議是:不要將大文件讀入數組。 嘗試重新編寫下游代碼以與Stream
API,某種“讀取器” API或某種解析迭代器塊一起使用。
如果不了解其余代碼如何處理事情,就很難多說了。 但是,最好在代碼上運行內存分析器,以確認確實是導致內存問題的byte[]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.