最近要帮硬件的同事处理一点信号数据,因为要做成一个可显示图标的简单工具,这里选择使用C#。
原始数据大概有2000w调左右,都是双精度,要将数据转换为byte类型,同时还要统计其分布,计算相关性等等。所以考虑将所有数据都放到一个list中,再将处理完的数据放到另一个list中,经过多步处理,竟然已经生成了多个list(因为每一步的处理数据后面都需要用到所以不方便在同一list中进行复用)。然后调试过程中就报了“需要分配的持续内存不足”的错。
研究之后发现,list的内存大小,由Capacity控制,当Capacity=4,而要添加第五个元素时,Capacity就会增长一倍变为8,以后每次不够时,Capacity=Capacity2。
所以说Capacity一直是2的倍数,而比2000w更大,最接近2000w的就是2^25=33554432,如果是double类型,就相当于只需要2000w8Byte的内存空间,但是实际上分配的多了1300w*8Byte的内存,就是104M的内存,这就造成了很大的内存浪费。
解决办法,因为所有的数据处理都是基于2000w数据的,而且处理算法确定,所以处理完有多少条数据也可以计算得出。这样可以在每次实例化list对象时,就定义好Capacity的大小,List<T> list = new List<T>(Capacity),这样只会分配指定Capacity的内存,不会造成浪费。
大List的内存分配优化
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 在 Java 中,内存的分配是由程序完成的,而内存的释放则是由 Garbage Collecation(GC) 完...
- 动画:无 音频:《岳阳楼记》三遍+婷婷唱古文至少十首+1a顺序播放 阅读:陪生英文分级 这些书读起来越来越容易理解...