14

我有一个内存有界队列,其中多个线程对对象进行排队。通常,队列应该由处理队列中项目的单个读取器线程清空。

但是,队列可能已满。在这种情况下,我想在磁盘上保留任何其他项目,这些项目将由另一个后台阅读器线程处理,该线程扫描目录中的此类文件并处理文件中的条目。我熟悉 Active MQ,但更喜欢更轻量级的解决方案。如果不严格遵循“FIFO”是可以的(因为持久化的条目可能会被乱序处理)。

有没有开源解决方案?我没有找到任何东西,但我想我会在自己开始实施之前对这个列表进行 ping 操作以获取建议。

谢谢!

4

7 回答 7

6

您可以使用 SQLLite 之类的东西来存储对象。

于 2010-06-30T23:06:21.833 回答
6

看看http://square.github.io/tape/及其令人印象深刻的 QueueFile。

(感谢 Brian McCallister 的“长尾宝库”指点我)。

于 2014-01-28T15:43:55.573 回答
3

EHCache 可以溢出到磁盘。它也是高度并发的,虽然你并不真的需要那个

于 2010-06-30T23:05:25.180 回答
1

为什么队列是有界的?为什么不使用动态可扩展的数据结构?这似乎比涉及磁盘要简单得多。

编辑: 没有更多上下文很难回答你的问题。

您能否澄清“内存不足”的含义?队列有多大?你有多少内存?

您使用的是内存很少的嵌入式系统吗?或者队列中有 2 GB 或更多的内容?

如果其中任何一个为真,那么您真的应该使用像 BTree 这样的“可交换”数据结构。为一个队列实现一个你自己似乎有点矫枉过正。我只会使用像 SQL lite 这样的嵌入式数据库。

如果我们都不是真的,那么只需使用向量或链表。

编辑 2: 您可能不需要 BTree 或数据库。您可以只使用链接的页面列表。但再次,我不得不问:这有必要吗?

或者,如果您愿意以非串行方式处理事物,为什么不一直拥有多个读取器线程呢?

最后,虽然我不认为你的建议是要走的路。

于 2010-06-30T23:30:39.957 回答
1

您可以嵌入 berkley db java 版本以将队列元素保存在文件中。

您可以在这里查看工作示例:http: //sysgears.com/articles/lightweight-fast-persistent-queue-in-java-using-berkley-db

希望这可以帮助

于 2011-03-03T11:09:44.587 回答
1

MapDB 提供由磁盘存储或堆外内存支持的并发 Map、Set 和 Queue。它是一个快速且易于使用的嵌入式 Java 数据库引擎。

https://github.com/jankotek/MapDB

http://www.mapdb.org/

于 2015-05-15T19:00:48.727 回答
1

我现在发现的最高效和 GC 友好的解决方案是Chronicle Queue。它具有极低的写入延迟,几十纳秒的数量级,比 MapDB 或 SQLite 低几个等级。

于 2017-04-03T09:22:41.587 回答