繁体   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