Alb*_*rto 7 c# garbage-collection idisposable
我有一些对象读取文件,将数据保存在数组中并进行一些操作.序列是创建对象A,使用对象A操作.创建对象B,使用对象B操作...每个对象读取的数据可能大约为10 MB.因此,最好的选择是在每个对象操作后删除每个对象.假设我希望我的程序在内存中分配大约10 MB,而不是10MB*1000对象= 1GB
对象类似于:
class MyClass
{
List<string[]> data;
public MyClass(string datafile)
{
using (CsvReader csv = new CsvReader(new StreamReader(datafile), true))
{
data = csv.ToList<string[]>();
}
}
public List<string> Operate()
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我应该实施处置吗?做一些像:
List<string> results = new List<results>();
using (MyClass m = new MyClass("fileM.txt"))
{
results.AddRange(m.Operate());
}
using (MyClass d = new MyClass("fileD.txt"))
{
results.AddRange(d.Operate());
}
...
Run Code Online (Sandbox Code Playgroud)
我知道当你使用unmmanaged资源(套接字,流,...)时,建议实现Disposable,但在我的类中我只有大数据数组.
另一种方法是为每个对象创建函数(我想GC会自动删除函数中创建的对象):
List<string> results = new List<results>();
results.AddRange(myFunction("fileM.txt"));
results.AddRange(myFunction("fileD.txt"));
public List<string> myFunction(string file)
{
MyClass c = new MyClass(file);
return results.AddRange(c.Operate());
}
Run Code Online (Sandbox Code Playgroud)
IDisposable等在这里不会帮助你,因为它不会导致收集任何东西.在这种情况下,最好的方法可能是使用池来减少分配 - 实质上是成为您自己的内存管理器.例如,如果你List<string>很大,你可以通过重新使用列表来避免很多阵列 - 显然是在清除它们之后.如果你打电话.Clear(),后备阵列不会重置 - 它只是设置一个逻辑标记,将其视为空.在您的具体情况下,您的许多物品将成为个体string; 这比较棘手,但至少它们很小,应该可以在第0代收集.
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |