2008-11-13 2 views
3

로그 파일을 읽었지만 모든 행을 즉시 처리하려고하지는 않습니다. 기다리는 동안 줄을 저장하기 위해 대기열/버퍼를 사용하고 있습니다.최고의 콜렉션을 사용 하시겠습니까?

이 대기열은 특정 행에 대해 정기적으로 검사됩니다. 대기열에서 발견되면 대기열에서 제거됩니다 (임의의 위치에있을 수 있음). 발견 할 특정 행이 없을 때 처리 될 행 하나씩 대기열의 시작 부분에서 행을 가져옵니다.

따라서, 큐는 필요 다음

  • 가능이
  • 요소가 어디에서 제거 적이 크기를 조정 (또는 인상을 줄) 할
  • 요소 (항상 말에있을 것입니다 추가 대기열)
  • 빨리 스캔하십시오.
  • 성능에 따라 포인터가 마지막 스캔 위치에 있어야합니다.

Java 나 API에 대한 경험이 거의 없었을 때 처음에는 코드를 작성했으며, 가장 좋은 옵션 이었기 때문에 작동 할 것이라는 것을 알기 때문에 ArrayList를 사용했습니다.

처리해야 할 로그가 점점 많아지면서 성능이 저하되고 있습니다. 따라서이 상황에서 어떤 컬렉션을 사용 하시겠습니까? 내 자신의 글을 쓰는 가능성은 언제나 있습니다.

감사합니다.

답변

6

LinkedHashSet이 유용 할 수 있습니다. 효과적으로 HashSet이지만 예측 가능한 반복 순서를 허용하는 LinkedList를 유지하므로 중복 항목을 포함 할 수 없다는 장점이 추가되어 FIFO 대기열로도 사용될 수 있습니다.

은 (스캔과는 대조적으로) HashSet의도 검색 내가 당신의 최선의 선택이 될 것입니다 AVI와 연결리스트에 동의 equals()

+0

이것은 두 가지의 장점을 모두 제공합니다. 이 컬렉션을 알고있게 해줘서 고마워. 그렇지 않으면 전혀 생각하지 못했을거야. 0 : –

+0

이 컬렉션을 SDK에 추가하기 전에 반복적으로이 컬렉션을 만들었습니다. 놀랍게도 유용합니다. HashSet에서 직접 코드를 작성하고 LinkedList는 몇 줄의 코드 일뿐입니다.) –

4

아마도 LinkedList가 가장 적절할 것입니다. 이 클래스는 요청 된 모든 속성을 가지고 있으므로 ArrayList에 필요한 선형 시간보다는 링크가 일정 시간 내에 가운데에서 제거 될 수 있습니다.

제거 할 다음 요소를 찾는 특정 전략이있는 경우 PriorityQueue 또는 정렬 된 집합이 더 적합 할 수 있습니다.

+0

링크 된 목록을 삭제할 요소를 검색하는 속도가 느리지 않습니까? –

+0

LinkedList의 단점 중 하나가 될 수 있으며 검색 속도가 느려질 수 있습니다. –

+0

링크 된 목록에서 검색하는 것은 검색 유형에 따라 다릅니다. 모든 것을 진행하는 것은 매우 쉽고 삭제는 간단합니다. – deterb

2

스캔은 일반적으로 일종의 해시 기반 구현을 의미하며 ConcurrentSkipListMap은 좋은 구현 일 수 있습니다. 로그 (n)에 대한 containskey, 제거 및 가져 오기 방법, 그래서 당신과 관련된 우선 순위의 일종을 정렬 할 수 있습니다.

0

집합에서 요소를 제거하고 추가해야하고 특정 값을 검색해야하기 때문에 TreeSet과 같은 SortedSet을 구현하는 것이 더 나은 구조 일 수 있습니다. 이 클래스는 add, remove 및 contains에 대한 log (n) 성능을 보장합니다.

0

일부 스레드는 대기열에 쓰고 다른 스레드는 대기열에서 읽습니다.

이 경우 java.lang.concurrent 패키지의 대기열을 확인해야합니다.

PriorityBlockingQueue를 사용하면 요소를 정렬 할 수 있고 LinkedBlockingQueue를 사용하면 반복하여 반복적으로 제거 할 요소를 선택할 수 있습니다.

1

나는 읽는 줄을 분류하고 싶지 않습니다. (그들은 원래의 순서대로 보관해야합니다). 그러나 잠재적으로 각 기록 된 회선의 세션 ID (세션 당 기록 된 회선 수)에 따라 회선을 차단할 수 있습니다.

HashMap<String,LinkedList<String>> 

을하고, 키와 세션 ID를 제공하고, 세션에 속하는 라인과 LinkedList의를 채울 : 그것에 대해 생각

, 나는 잠재적으로있을 수 있습니다.

지도를 사용하면 세션 X와 관련된 행을 빠르게 검색 할 수 있으며 링크 된 목록은 행을 추가/제거하는 최상의 성능을 제공합니다 (검색 성능은 세션 x, 따라서 세션 x와 함께 수행 할 실제 행을 읽고 끝낼 수 있습니다 (푸시/팝).

크기가 조정되고 끝에 줄이 추가되어 항상 처음부터 가져온 링크 된 목록보다 우수한 컬렉션이 있습니까? Queue 컬렉션이 연결된 목록을 확장한다고 생각합니다.

0

에 O (1)가 일치 할 수있는 경우가 될 수 있기 때문에. 쉽게 크기를 조정하고 목록 끝에 빨리 추가 할 수 있으며 어디에서나 신속하게 제거 할 수 있습니다. 검색 속도는 빠르지 만 다른 정렬되지 않은 목록은 더 나쁘지 않습니다.

0

Guava 도움이 될 수 있습니다. 컬렉션, 캐싱, 원시 지원, 동시성 라이브러리, 공통 주석, 문자열 처리, I/O, 등 :

구아바 프로젝트는 우리가 우리의 자바 기반 프로젝트에 의존하는 구글의 핵심 라이브러리의 몇 가지 포함되어 있습니다.

관련 문제