2

在我的应用程序中,我正在使用 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;
4

1 回答 1

4

通过编辑,问题很明显:

System.Reflection.Assembly a = Assembly.Load(bytes);

事情是这样的:程序集不会AppDomain. 有一些可收集垃圾的东西,例如DynamicMethod- 但不是完整的组件。AppDomain如果您正在加载程序集,唯一安全的方法是在进程中单独加载。然后,您可以在完成后放弃AppDomain它(这会卸载其中的所有内容)。


实际上,不能保证您现有的代码甚至可以工作-Read不能保证读取所有数据。我有一篇关于那个的未决博客文章......

但是:如果文件很大,很可能你正在慢慢地使 LOH 饱和,这是一个非压缩堆。我能提供的最好建议是:不要将大文件读入数组。尝试重写下游代码以使用StreamAPI、某种“阅读器”API 或某种解析迭代器块。

如果没有看到其余代码如何处理事情,很难说更多。但是,最好在代码上运行内存分析器以确认确实byte[]是导致内存问题的原因。

于 2013-02-25T08:15:35.823 回答