在我的 C# 控制台应用程序中,我实例化了一个 MyType 类型的对象 MyObject。该对象包含 6 个非常大的数组,其中一些包含原始类型的元素,另一些包含其他引用类型的元素。后者又可以包含大数组。为了实例化所有这些数组,我做了一些密集的处理,持续大约 2 分钟。
我正在使用的机器有 4 GB RAM,在 32 位 Windows 上。在运行我的控制台应用程序之前,可用内存约为 2413 MB,在完成之前,可用内存约为 300-400 MB。
在我为对象 MyObject 中的所有数组分配值后,我将对其进行序列化。我的目标是实例化和序列化 50 个像这样的对象。所以在序列化之后,我将所有数组都设置为空。[这不会立即反映在任务管理器中,可用内存仍然是 300-400 Mo。所以我假设 GC 不会立即收集。] 此后,我正在重新执行在 MyObject 中实例化数组的方法。我几乎立即得到系统内存不足异常。我认为这不是在.NET 中有效管理内存的正确方法。
所以我的问题是:知道处理一个 MyType 类型的对象,如 MyObject,“适合”可用内存资源,我如何实例化一个 MyType 类型的对象,序列化它,然后完全清理所有用于这个目的?然后,要么重新实例化同一个对象,要么重新实例化一个相同类型的新对象?所以我最终得到了 50 个不同的 MyType 类型的序列化对象?
谢谢。
用代码更新问题。这是我的代码的简化版本:
class MyType
{
int[] intArray; int[] intArray2;
double[] doubleArray;
RefType1[] refType1Array;
RefType2[] refType2Array;
RefType3[] refType3Array;
public MyType (params)
{
for (int i = 0; i < 50; i++)
{
instantiateArrays();
serializeObject();
releaseMemory();
}
}
private void instantiateArrays()
{
//instantiate all the primitive arrays with 50.000 elements per array
//instantiate refType1Array with 300 elements, refType2Array with 3000 elements and
//refType3Array with 150 elements
//lasts about 2 minutes
}
private void serializeObject()
{
Stream fileStream = File.Create(filePath);
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(fileStream, this);
fileStream.Close();
}
private void releaseMemory()
{
intArray = null;
intArray2 = null;
doubleArray = null;
refType1Array = null;
refType2Array = null;
refType3Array = null;
}
}
RefType1 包含整数和双精度字段,以及另一个平均有 50 个元素的整数数组。RefType2 和 RefType3 包含整数和双精度字段,以及另一个引用类型 RefType4 的数组。平均而言,该数组包含 500 个对象。每个 RefType4 对象平均包含一个由 15 个整数组成的数组。