2008-11-13 53 views
3

我正在阅读日志文件,但并非所有行都想立即处理。我正在使用队列/缓冲区来存储等待处理的行。要使用的最佳集合?

定期扫描此队列中的特定行 - 当它们被发现时,它们将从队列中移除(它们可以位于其中的任何位置)。如果没有找到特定的行,则会逐行从队列的起始处取出行进行处理。

因此,队列需要以下内容:

  • 懂调整大小(或给这样的印象)
  • 有元件从任何地方除去
  • 有元素的加入(将永远在的端队列)
  • 快速扫描
  • 根据性能的不同,在最后一次扫描中有一个指向它的位置的指针。

我最初编写代码的时候,我没有什么Java或API的经验,只是使用ArrayList,因为我知道它会工作(不一定是因为它是最好的选择)。

随着越来越多的日志需要处理,它的性能变得越来越差 - 所以,你会推荐在这种情况下使用哪些集合?总是有写我自己的可能性。

谢谢

回答

6

LinkedHashSet可能是有趣的。它实际上是一个HashSet,但它也维护一个LinkedList以允许可预测的迭代顺序 - 因此也可以用作FIFO队列,并带来很好的附加好处,即它不能包含重复条目。

因为它是一个HashSet太大,搜索(而不是扫描)可以是O(1),如果他们可以匹配equals()

4

LinkedList可能是最合适的。它具有所有请求的属性,并允许在常量时间内从中间删除链接,而不是ArrayList所需的线性时间。

如果您有一些特定策略来查找下一个要移除的元素,那么PriorityQueue或甚至排序的集合可能更合适。

+0

岂不链表用于搜索要删除的元素慢? – 2008-11-13 10:17:21

+0

这将是LinkedList的一个不利方面,可能会降低搜索速度 – 2008-11-13 10:56:22

2

快速扫描通常意味着某种基于哈希的实现,ConcurrentSkipListMap可能是一个很好的实现。在containskey上记录(n),移除并获取方法,并对其进行排序,以便您可以拥有某种与其关联的优先级。

0

因为您需要从集合中删除和添加元素,并搜索特定值,所以更好的结构可能是实现SortedSet的东西,比如TreeSet。这个类保证了log(n)性能的添加,删除和包含。

0

我想一些线程将写入队列,另一个线程将读取它。

在这种情况下,您应该查看java.lang.concurrent包中的队列。

您可以使用PriorityBlockingQueue让它为您排序元素,如果您想遍历它并选择要移除的元素,则可以使用LinkedBlockingQueue。

1

我不想对正在读取的行进行排序(它们需要按原始顺序保存)。但是,我可能会根据每个记录行具有的会话标识(每个会话有几个记录的行)来屏蔽这些行。

关于它的思考,我可能有一个:

HashMap<String,LinkedList<String>> 

,并提供会话ID为重点,并使用属于该会话的线路LinkedList的。

该地图将提供一种快速方法来搜索与会话X相关的行,然后链接列表将提供最佳性能来添加/删除行(搜索性能是查找会话x的行,因此,会话x的实际行可以被读取并从开始到结束被删除 - 推/弹出)。

有没有更好的收集比链表这将重新调整,在结尾处添加的行,总是从一开始就采取了?我认为Queue集合扩展了链表吗?

0

我有AVI和链表同意将是你最好的选择。您可以轻松调整大小,快速添加到列表的末尾,快速从任何地方移除。搜索不会很快,但不会比其他任何未排序的列表更糟糕。

0

Guava可能会有帮助。

Guava项目包含我们在基于Java的项目中所依赖的几个Google核心库:集合,缓存,原语支持,并发库,常用注释,字符串处理,I/O等等。