我有一些读取文件的对象,将数据保存在数组中并进行一些操作。序列是创建对象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()
{
...
}
}
我的问题是:我应该实现处置吗?并做类似的事情:
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());
}
...
我读到在使用非托管资源(套接字、流等)时建议实现 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());
}
最佳答案
IDisposable
etc 在这里对你没有帮助,因为它不会导致收集任何东西。在这种情况下,也许最好的方法是使用池 来减少分配——本质上成为您自己的内存管理器。例如,如果您的 List<string>
很大,您可以通过重新使用列表来避免很多数组 - 显然在清除它们之后。如果您调用 .Clear()
,后备数组不会重置 - 它只是设置一个逻辑标记以将其视为空。在您的具体情况下,您的很多对象将是个人 string
;这比较棘手,但至少它们很小,应该可以在零代收集。
关于c# - 需要删除对象 : implement Dispose or create objects in a function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15015631/