最近要帮硬件的同事处理一点信号数据,因为要做成一个可显示图标的简单工具,这里选择使用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顺序播放 阅读:陪生英文分级 这些书读起来越来越容易理解...