2008-11-13 61 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等等。