关于c#开辟连续数组内存不够的问题

duochenpeng6771 2019-09-14 11:18:27
c#程序是32位的,需要加入一个c++编写的算法处理dll,这个dll参数需要传入两个结构体数组,每个数组大约150mb,一个参数数组是只需要一次开辟重复使用,另一个参数数组需要每次重新开辟新内存传入。整个程序峰值占用600mb内存.
现在的问题是,dll模块只能在第一次调用的时候成功,因为c#使用intptr 传入参数的,并且在第二次调用之前,也已经用Marshal.FreeCoTaskMem将intptr占用的内存释放掉了,后续调用还是会报内存不够的错误。
我分析是因为内存无法开辟所需大小的连续内存。
请问各位,如何解决c#无法开辟连续内存的问题呢,还有其他手段可以将连续的大内存传入dll中吗,或者dll如何修改才能满足要求。。。。
...全文
510 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
XBodhi. 2019-09-21
  • 打赏
  • 举报
回复
多少不够你用的 如果你非的存,那就压缩吧,或是自己构建一个 常驻结构,和一个存数据区域列表。然后用霍夫曼或是其他的算法给树化一下,这是我的一个建议。
duochenpeng6771 2019-09-20
  • 打赏
  • 举报
回复
谢谢大家回复,其实这个比较难弄,32位没办法更改64位,而且dll编写的问题,需要将内存一下子传进去,我试试静态数组,再不行的话只能让他优化dll模块了
wanghui0380 2019-09-20
  • 打赏
  • 举报
回复
MemoryPool<T> 其实应该更符合你的要求
wanghui0380 2019-09-20
  • 打赏
  • 举报
回复
如果是并发不大,是那种“一步一动”的同步命令式的,可以直接静态new一个,用lock锁只允许一个。 如果是需要并发,那就是池化byte,XX园那些基本玩意看完了,如果你不想自己写,可以直接用微软的 nuget.引用System.Buffers https://www.nuget.org/packages/System.Buffers/ 微软在这里给你实现了一个ArrayPool<T>,你可以直接用
wanghui0380 2019-09-20
  • 打赏
  • 举报
回复
bytepool ArraySegment<byte> 都成基本上就是池化,然后循环利用。C++也不是要你的整个数组,他只是要个指针。 怎么循环利用我不多说了,XX园一堆成天讨论NIO,内存字节池的,你自己找
OrdinaryCoder 2019-09-19
  • 打赏
  • 举报
回复
暂时解决方法 换成64位程序 能很大程度解决你的问题 剩下的就是找时间彻底解决 比如另一个结构也只开辟一次
不远1210 2019-09-19
  • 打赏
  • 举报
回复
可否参考Stream读写的方式呢?让dll在使用的时候,一部分一部分地取,而不是一下写入到内存中?
qq_15826817 2019-09-15
  • 打赏
  • 举报
回复
C#传参的时候用的数组用静态的,声明一次反复使用。再次使用的话记得清空原来的数据就行
吉普赛的歌 2019-09-14
  • 打赏
  • 举报
回复
这么大的数据量, 放数据库不行吗?

110,536

社区成员

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

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

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