【问题标题】:Memory pool for object with different size - C#具有不同大小的对象的内存池 - C#
【发布时间】:2012-11-12 12:49:35
【问题描述】:

您有什么解决方案,如何使对象池(内存池)可以包含不同的不同大小的数据?因此,如果我在内存池中请求具有一定大小的对象,它会返回给我一些分配的内存块,其大小与我的请求最接近。它应该用 C# 编写。谢谢,因为我真的不完全知道,这个和最佳算法的最佳集合是什么。在 C++ 中有一些解决方案,但 C# 没有内存池。

【问题讨论】:

  • 那是因为你不需要它......在C#中,内存管理由CLR处理。或者,在您的情况下,为什么需要进行显式内存管理?
  • 你需要它做什么?如果我没记错的话,内存池是用来避免堆碎片的。在 C# 中,垃圾收集应该负责处理这些事情,因此您不需要它。
  • 是的,我知道,我必须编写通信库,它允许客户端与服务器通信(通过特定的自己的协议),客户端(或多个客户端)向服务器发送数据,数据形式为消息(字符串)+ 数据(不同的大小和格式)。但是这种通信可以不间断地运行两到三周,因此它可以在通信期间发送数千条带有数据的消息。我的老板告诉我,他认为 Garbage Collection 不够好,我应该写 Memory Pool。但在这方面,我没有技能(记忆块等)。

标签: c# memory garbage-collection memory-pool


【解决方案1】:

.Net Framework 已经有这样的实现(由 Windows Communication Foundation 使用)。见BufferManager

var buffMgr = BufferManager.CreateBufferManager(
                 104857600, // use no more than 100 MB in total
                 10485760);  // allocate 10 MB max to each buffer
var buff = buffMgr.TakeBuffer(65535); // allocate a buffer enough to fit a 65 KB object
                           // note: this could return a buffer bigger than 65 KB 

//when done with the buffer:
buffMgr.ReturnBuffer(buff);

【讨论】:

  • 谢谢!这似乎是我正在寻找的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 2013-08-30
相关资源
最近更新 更多