从POSIX队列接收消息时如何节省内存?从POSIX队列接收消息时如何节省内存?
看来,当在多进程/多线程环境中使用POSIX队列时,没有线程安全的方式将消息出队到比max_msgsize小的缓冲区。
是否有任何标准解决此问题?或者它甚至是一个问题?
我很清楚还有其他非常棒的库可以做到这一点,但我只是想为用户提供一个完全标准的解决方案,如果他们不想处理依赖关系的话。我试图排队潜在的数百兆字节每个消息,并有一个进程池与多个线程每个出队消息进行处理。
感谢, Chenz
从POSIX队列接收消息时如何节省内存?从POSIX队列接收消息时如何节省内存?
看来,当在多进程/多线程环境中使用POSIX队列时,没有线程安全的方式将消息出队到比max_msgsize小的缓冲区。
是否有任何标准解决此问题?或者它甚至是一个问题?
我很清楚还有其他非常棒的库可以做到这一点,但我只是想为用户提供一个完全标准的解决方案,如果他们不想处理依赖关系的话。我试图排队潜在的数百兆字节每个消息,并有一个进程池与多个线程每个出队消息进行处理。
感谢, Chenz
的POSIX队列接口,为您注意,不允许你来查询消息的大小。
因此,实际上,所有的消息都可以按照队列定义配置的最大大小,并且您必须假定简单的实现可以很好地利用该消息来简化记录。
鉴于您正在处理数兆字节的消息,所以将这些消息放入队列中不太可能是一个好的解决方案(不幸的是)。
如果你的消息率低(至低一些定义),你实际做有一个合理的上限,那么就继续前进,并尝试一下。
除了这个,你的下一个最好的选择就是使用队列作为工作队列,而不是作为工作项队列。您的工作项目将不得不以不同方式存储在文件中。然后在队列中有一个很好的短文件名,指向要处理的工作项目的位置。
好运
我认为没有真正的好方法来做到这一点。这是一个想法,但我认为你会发现它由于锁竞争而表现不佳:
有一个静态缓冲区等于最大消息的大小。因为有一个共享的缓存,现在你出队的过程必须是这样的:
存在具有的开销静态缓冲区,但依赖于消息大小的分布,您仍然可能会看到总内存使用量减少。但是,现在您必须处理静态缓冲区的争用问题,这可能会很好,特别是当一些大消息连续到达时。如果非常大的消息很少,那么这可能不是一个可怕的解决方案。
为什么你不能只使用信号量来保护访问?也许我不太明白这个问题。 – frankc 2011-02-11 21:10:34
无法查询队列中下一条消息的大小,因此我必须分配一个等于消息允许的最大大小的缓冲区。 – 2011-02-14 13:03:14
谢谢,现在我明白了。 – frankc 2011-02-14 19:03:16