簡體   English   中英

讀取文件時出現OutOfMemoryException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM