從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