C#使用列表或数组技术节省内存占用

C#使用列表或数组技术节省内存占用,c#,arrays,list,memory-management,arraylist,C#,Arrays,List,Memory Management,Arraylist,所以我运行了一个模拟,它有3个大约200k个对象的列表。每个对象保存关于点(x、y、z)的信息,并包含一个x对象数组 根据模拟中(动画)的帧数,每个点对象包含一个数组,比如说64个值 整个模拟占用了大约11G的RAM。这对我们的许多用户来说太多了。因此,我想知道在这种情况下是否有聪明的方法来节省内存使用 这些点中至少有60%的数组具有值0。我已经想到了使用列表作为指针的方法,以便相同的值(例如0)不会像在C++中那样保存在内存中数万次。然而,我无法在C#中实现这一点 任何减少模拟占用的11G内存

所以我运行了一个模拟,它有3个大约200k个对象的列表。每个对象保存关于点(x、y、z)的信息,并包含一个x对象数组

根据模拟中(动画)的帧数,每个点对象包含一个数组,比如说64个值

整个模拟占用了大约11G的RAM。这对我们的许多用户来说太多了。因此,我想知道在这种情况下是否有聪明的方法来节省内存使用

这些点中至少有60%的数组具有值0。我已经想到了使用列表作为指针的方法,以便相同的值(例如0)不会像在C++中那样保存在内存中数万次。然而,我无法在C#中实现这一点

任何减少模拟占用的11G内存的提示或技巧都值得赞赏

如上所述的点对象是:

public class Vertex { 
    public Point3D position; 
    public float[] delta; 
}
还有3个网格。将对象保存在以下位置:

public List<Vertex> Vertices;
公共列表顶点;
阵列的填充方式是使用另一个点列表,大致与网格对齐,但不完全与每个顶点对齐,这些点的位置在每一帧都会发生变化,因此每一帧,每个点都必须将其值的一小部分指定给附近的每个顶点。因此,填充顶点并不像看上去那么直接

目前,我通过初始化大小为64的数组来实现这一点。然后根据是否存在任何闭合点,将为该数组中当前帧的位置指定一个值(或多个值的平均值)。
使用@kookiz的方法可能是可行的,但会比表面上看起来更难。

请共享您的结构代码扫描您向我们展示用于定义数据结构的代码?您的数组将包含哪些值?在任何情况下,如果您经常创建和销毁对象,您可能会要求垃圾收集器更频繁地进行清理,从而获得一些好处。如果我理解正确,您有一个点列表,并且每个点都有一个存储每个帧的增量的数组?一个解决方案可能是重新思考整个数据结构:而不是按顶点思考,而是按帧思考,然后从磁盘中流式传输。当然,只有当一个帧的计算时间足够大,并且不会因为下一个帧从服务器加载而减慢计算速度时,才需要这样做disk@Satchmode请编辑您的问题并在那里添加代码(继续我之前的评论):考虑每帧而不是每顶点的一个优点是,对于第一帧之后的每一帧,您只能存储已更改顶点的信息,从而减少每60%的数据量(根据您的估计)。这就是MPEG视频的编码方式。