首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在文本文件中读写优先级队列的有效方法是什么?

问在文本文件中读写优先级队列的有效方法是什么?
EN

Stack Overflow用户
提问于 2011-09-05 16:47:40
回答 4查看 2K关注 0票数 0

我有一个优先级队列类,我用Java实现了它,因为它是一个队列数组。我需要一种很好的方法(不需要使用序列化)来记录和存储优先级队列中每个对象的“事务”或enqueue()/dequeue()之后优先级队列的内容。当程序需要从文本文件中重建优先级队列时,它应该充当备份。

我有一些想法,我的问题是:

  • 在每个“事务”之后,循环遍历队列,并使用对象之间的分隔符将每个队列写入文件中的一行。--我的问题是,它需要将所有对象排出队列并重新排队,这似乎是高度inefficient.
  • After,每个队列或脱队列只需写入该对象或从文件中删除该对象。--我的问题是:如果这是我应该采用的方法,那么我很难想出一种方法,在退出队列后很容易地找到和删除对象。

任何提示/提示/建议将不胜感激!

EN

回答 4

Stack Overflow用户

发布于 2011-09-05 17:03:14

要循环一个队列,只需遍历它。这是无损的(但只有松散的线程安全)

每次将队列的内容写入磁盘可能会非常慢。对于一个典型的硬盘驱动器,一个小队列将需要大约20毫秒的时间来编写。也就是每秒最多50次。如果您使用SSD,这对于一个小队列来说要快得多,但是,即使您不使用序列化,仍然必须对数据进行封送。

另一种选择是使用JMS服务器,该服务器旨在支持事务、队列和持久性。一个典型的JMS服务器每秒可以处理大约10,000条消息。有许多好的免费服务器可用。

票数 1
EN

Stack Overflow用户

发布于 2011-09-05 17:13:01

我会将您的需求实现为日志模式。在文件的末尾,追加每个队列及其优先级,并追加每个脱队列。如果您的消息服务器崩溃,您可以重播日志文件,并将以适当的状态结束。

显然,随着时间的推移,您的日志文件将变得巨大。为了解决这一问题,您需要频繁地旋转日志文件。为此,请在某个时间点序列化队列,然后开始在新文件中登录。您甚至可以在不锁定状态(冻结queu请求)的情况下完成这一任务,方法是同时将事务记录到旧日志和新日志,同时将数据结构的快照写入磁盘。快照完成后,将指示该指针的指针写入磁盘,然后可以删除旧日志。

写的时间和空间都是n,回放应该比较少,而且比较快。

票数 1
EN

Stack Overflow用户

发布于 2011-09-05 17:08:33

为了在第二种方法中轻松找到对象.我有几个建议:

  1. 您可以使用您的优先级函数来保持对象在文件中的排序。
  2. 可以在不同的位置管理新添加的对象,在文本文件中的每个插入对象之间以及在插入对象时保留一些空间,您可以使用一些类似指针的行为来指定偏移量或其他易于管理的内容。
  3. 使用缓冲区,因为每次编写内容的速度都很慢。如果在指针所指向的小桶中使用优先级函数,则
  4. 的删除将非常简单,并且可以通过在某个时候压缩所有对象来使用垃圾收集类型的行为。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7310814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档