我有一个优先级队列类,我用Java实现了它,因为它是一个队列数组。我需要一种很好的方法(不需要使用序列化)来记录和存储优先级队列中每个对象的“事务”或enqueue()/dequeue()之后优先级队列的内容。当程序需要从文本文件中重建优先级队列时,它应该充当备份。
我有一些想法,我的问题是:
任何提示/提示/建议将不胜感激!
发布于 2011-09-05 17:03:14
要循环一个队列,只需遍历它。这是无损的(但只有松散的线程安全)
每次将队列的内容写入磁盘可能会非常慢。对于一个典型的硬盘驱动器,一个小队列将需要大约20毫秒的时间来编写。也就是每秒最多50次。如果您使用SSD,这对于一个小队列来说要快得多,但是,即使您不使用序列化,仍然必须对数据进行封送。
另一种选择是使用JMS服务器,该服务器旨在支持事务、队列和持久性。一个典型的JMS服务器每秒可以处理大约10,000条消息。有许多好的免费服务器可用。
发布于 2011-09-05 17:13:01
我会将您的需求实现为日志模式。在文件的末尾,追加每个队列及其优先级,并追加每个脱队列。如果您的消息服务器崩溃,您可以重播日志文件,并将以适当的状态结束。
显然,随着时间的推移,您的日志文件将变得巨大。为了解决这一问题,您需要频繁地旋转日志文件。为此,请在某个时间点序列化队列,然后开始在新文件中登录。您甚至可以在不锁定状态(冻结queu请求)的情况下完成这一任务,方法是同时将事务记录到旧日志和新日志,同时将数据结构的快照写入磁盘。快照完成后,将指示该指针的指针写入磁盘,然后可以删除旧日志。
写的时间和空间都是n,回放应该比较少,而且比较快。
发布于 2011-09-05 17:08:33
为了在第二种方法中轻松找到对象.我有几个建议:
https://stackoverflow.com/questions/7310814
复制相似问题