【发布时间】:2017-12-30 20:10:29
【问题描述】:
我正在尝试在 Windows 10 64 位操作系统中使用 ZeroMQ 传输大量字节(大小:12 兆字节)。传输速率约为每秒 15 帧。
代码抛出以下错误:
Exception thrown: 'System.OutOfMemoryException' in ZeroMQ.dll
在使用 Visual Studio 调试期间,它显示 4GB 进程内存,如下图所示:
但是,当我检查操作系统中的内存消耗时,它显示 8GB 中的 7.1GB。但是 801MB 仍然没有使用,这让我想知道 System.OutOfMemoryException 异常。
请看下面的截图:
计算机配备千兆以太网卡。卡片使用情况见下文:
请看下面的代码:
ZContext zmqContext;
ZSocket publisher;
Stopwatch watch;
readonly byte[] longByteArray = new byte[12000000];
Program()
{
zmqContext = new ZContext();
publisher = new ZSocket(zmqContext, ZSocketType.PUB);
publisher.Bind("tcp://*:11111");
var timer = new Timer();
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Interval = 1000.0 / 15;//15 FPS
timer.Enabled = true;
}
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
var frame = new ZFrame(longByteArray);
publisher.Send(frame);
frame.Dispose();
}
以下是我的观察:
- 虽然在实际代码中无法更改 FPS,但是,上面的代码 sn -p 是示例代码,在此代码中,我将 FPS 从 15 更改为 10。一段时间后仍然会弹出错误。 最初,内存消耗较少,但随着时间的推移,它会不断增加。
我的问题如下:
- 根据我上面的观察,ZeroMQ 发布者似乎将消息保存在队列中,这会占用大量内存。我想知道是否可以将 ZeroMQ 配置为仅在队列中保留一条消息(最后一条即最新消息),以便 ZeroMQ 可以丢弃其他消息,从而减少内存消耗。
- 为什么会抛出异常,即使 801MB 内存仍然可用?
- 是否有任何其他解决方法可以使代码正常工作?
【问题讨论】:
-
@ErikFunkenbusch:限制与
longByteArray的长度相差甚远,即 12,000,000。