我有一个内存有界的队列,其中有多个线程队列对象。通常,队列应该由处理队列中项目的单个读取器线程清空。
但是,队列可能已填满。在这种情况下,我想在磁盘上保留任何其他项目,这些项目将由另一个后台读取器线程处理,该线程扫描目录中的这些文件并处理文件中的条目。我熟悉Active MQ,但更喜欢更轻量级的解决方案。如果没有严格遵循“FIFO”,则可以(因为可以不按顺序处理持久化的条目)。
那里有没有开源解决方案?在我自己开始实施之前,我没有发现任何事情,但我认为我会在此列表中查找建议。
谢谢!
答案 0 :(得分:6)
查看http://square.github.io/tape/及其令人印象深刻的QueueFile。
(感谢Brian McCallister的“The Long Tail Treasure Trove”指点我)。
答案 1 :(得分:4)
您可以使用类似SQLite的东西来存储对象。
答案 2 :(得分:3)
EHCache可以溢出到磁盘。它也是高度并发的,尽管你真的不需要那个
答案 3 :(得分:1)
为什么队列有界?为什么不使用动态可扩展的数据结构?这似乎比涉及磁盘简单得多。
修改强> 在更多背景下很难回答你的问题。
你能澄清“内存不足”的意思吗?队列有多大?你有多少记忆?
您是否使用内存非常少的嵌入式系统?或者队列中有2 GB或更多的东西?
如果其中一个是真的,那么你真的应该使用像BTree这样的“可交换”数据结构。为一个队列实现一个你自己似乎有点矫枉过正。我会使用像SQL lite这样的嵌入式数据库。
如果这些都不是真的,那么只需使用矢量或链表。
编辑2: 您可能不需要BTree或数据库。您可以使用链接的页面列表。但是,再次, 我不得不问:这有必要吗?
或者,如果您愿意非串行处理事情,为什么不一直有多个读者线程?
最终,虽然我不认为你的建议是可行的。
答案 4 :(得分:1)
你可以嵌入berkeley db java版本来保存文件中的队列元素。
您可以在此处查看工作示例: http://sysgears.com/articles/lightweight-fast-persistent-queue-in-java-using-berkley-db
希望这有帮助
答案 5 :(得分:1)
我现在发现的最高性能和GC友好解决方案是Chronicle Queue。 它具有极低的写入延迟,数十纳秒的数量级,比MapDB或SQLite低几个等级。
答案 6 :(得分:0)
MapDB提供由磁盘存储或堆外内存支持的并发映射,集和队列。它是一种快速且易于使用的嵌入式Java数据库引擎。