从POSIX队列接收邮件时如何节省内存?
似乎在多进程/多线程环境中使用POSIX队列时,没有线程安全的方法将消息出列到任何小于max_msgsize的缓冲区。
此问题是否有标准解决方案?或者甚至是一个问题?
我很清楚还有其他非常好的库可以做到这一点,但我只是想为用户提供一个完全标准的解决方案,如果他们不想处理依赖关系。
仅供参考,我正在尝试为每条消息排队数百兆字节,并且拥有一个包含多个线程的进程池,每个进程将消息出列以进行处理。
谢谢, Chenz
答案 0 :(得分:2)
正如您所注意到的,POSIX队列界面不允许您查询消息的大小。
因此,实际上,所有消息都可能处于队列定义所配置的最大大小,并且您必须假设一个简单的实现可能会利用它来简化记录保存。
鉴于您正在处理多兆字节的消息,所以将这些消息放入队列中不太可能是一个好的解决方案(不幸的是)。
如果你的信息率很低(某些低的定义)并且你确实有一个合理的上限,那么就去试试吧。
除此之外,您最好的选择是将队列用作工作订单队列,而不是工作项队列。您的工作项可能必须以不同方式存储在文件中。然后在队列中你有一个很好的短文件名,指向要处理的工作项的位置。
祝你好运
答案 1 :(得分:0)
我认为没有真正好的方法可以做到这一点。这是一个想法,但我认为你会发现它由于锁争用而表现不佳:
有一个静态缓冲区等于最大消息的大小。因为有共享缓冲区,所以现在您的出列过程必须如下所示:
有静态缓冲区的开销,但依赖于消息大小的分布,您仍然可能会看到总内存使用量的减少。但是,现在你必须处理静态缓冲区的争用,这可能是很好的,特别是当一些大的消息连续到达时。如果非常大的消息很少,那么这可能不是一个糟糕的解决方案。