gpt4 book ai didi

c# - 读取文件时出现 OutOfMemoryException

转载 作者:行者123 更新时间:2023-11-30 21:00:12 26 4
gpt4 key购买 nike

在我的应用程序中,我正在使用 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 或某种解析迭代器 block 。

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

关于c# - 读取文件时出现 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15062624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com