如何合并数组最高效内存占用最小

蔡袅 2013-07-20 03:47:16
//上次剩余长度
int iLastLeft = m_datagramBuffer.Length;
//合并之后的大小
int iCombineLen = iLastLeft + readBytesLength;
//合并缓存
byte[] bTmpAlls = new byte[iCombineLen];
//m_AllBuffer 与当前可读数据合并
Buffer.BlockCopy(m_datagramBuffer, 0, bTmpAlls, 0, iLastLeft);
Buffer.BlockCopy(m_receiveBuffer, 0, bTmpAlls, iLastLeft, readBytesLength);


目的得到m_datagramBuffer和m_receiveBuffer的合并数组,数组有时候比较大
这样写的,还是会出现OutOfMemoryException异常
...全文
199 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dota_371581 2013-07-23
  • 打赏
  • 举报
回复
我以前看一个人的代码,跟你说的情况类似,他处理的方法是先创建一个适当的缓存,每收到一个数组就判断长度,然后截取或者放到缓存里,递归调用该方法。
烈火蜓蜻 2013-07-22
  • 打赏
  • 举报
回复
关键是你要写清楚,你要干什么。 Buffer.BlockCopy(m_datagramBuffer, 0, bTmpAlls, 0, iLastLeft); Buffer.BlockCopy(m_receiveBuffer, 0, bTmpAlls, iLastLeft, readBytesLength); 最好是这样。 创建一个缓存区,比如10K,这个缓存区的大小一定要能容纳你最大的数据包, 然后每次处理完一个包之后,就把缓冲区中剩下的数据移动缓冲区的最前面,然后又开始合并下一次接收的数据, 如此反复。 1.合并 2.判断是否完整 3.移除完整包 4.剩余数据往前移
蔡袅 2013-07-22
  • 打赏
  • 举报
回复
还在等待各位寻求方案呢?
蔡袅 2013-07-20
  • 打赏
  • 举报
回复
引用 4 楼 charles_y 的回复:
[quote=引用 2 楼 xx_mm 的回复:] [quote=引用 1 楼 guwei4037 的回复:] vb?帮你顶一下。 数组比较大,多大呢?Buffer.BlockCopy这个方法执行多长时间呢?
Buffer.BlockCopy执行倒是很快,为了合并得new一个新数组这里会溢出。呢。[/quote] new 的时候溢出?是不是长度数据出错了?[/quote]恩,new的时候溢出,其实有时候才几百K就溢出了。数据长度没错
引用 5 楼 charles_y 的回复:
[quote=引用 3 楼 xx_mm 的回复:] 数组其实也不是很大。2M以内 由于服务端频繁创建导致了溢出
那就别频繁创建,建个大点全局缓冲区,如果需要更大的再重新new[/quote] 其实是这样,客户端发送过来的缓冲区需要组包,得把前面剩下的组合到现在接受到的,可能有几M也可能几K,所以这个数组很动态得重建,扩容
charles_y 2013-07-20
  • 打赏
  • 举报
回复
引用 3 楼 xx_mm 的回复:
数组其实也不是很大。2M以内 由于服务端频繁创建导致了溢出
那就别频繁创建,建个大点全局缓冲区,如果需要更大的再重新new
charles_y 2013-07-20
  • 打赏
  • 举报
回复
引用 2 楼 xx_mm 的回复:
[quote=引用 1 楼 guwei4037 的回复:] vb?帮你顶一下。 数组比较大,多大呢?Buffer.BlockCopy这个方法执行多长时间呢?
Buffer.BlockCopy执行倒是很快,为了合并得new一个新数组这里会溢出。呢。[/quote] new 的时候溢出?是不是长度数据出错了?
蔡袅 2013-07-20
  • 打赏
  • 举报
回复
数组其实也不是很大。2M以内 由于服务端频繁创建导致了溢出
蔡袅 2013-07-20
  • 打赏
  • 举报
回复
引用 1 楼 guwei4037 的回复:
vb?帮你顶一下。 数组比较大,多大呢?Buffer.BlockCopy这个方法执行多长时间呢?
Buffer.BlockCopy执行倒是很快,为了合并得new一个新数组这里会溢出。呢。
全栈极简 2013-07-20
  • 打赏
  • 举报
回复
vb?帮你顶一下。 数组比较大,多大呢?Buffer.BlockCopy这个方法执行多长时间呢?

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧