문제

로그 파일을 읽고 있지만 모든 라인이 곧바로 처리되기를 원하는 것은 아닙니다. 처리를 기다리는 동안 줄을 저장하기 위해 큐 / 버퍼를 사용하고 있습니다.

이 대기열은 특정 라인에 대해 정기적으로 스캔됩니다. 발견되면 대기열에서 제거됩니다 (어디서나있을 수 있음). 특정 선이 없으면 대기열의 시작 부분에서 하나씩 선을 꺼냅니다.

따라서 큐에는 다음이 필요합니다.

  • 크기를 조정할 수 있습니다 (또는 그 인상을주십시오)
  • 어디서나 요소를 제거하십시오
  • 요소가 추가되었습니다 (항상 대기열 끝에있을 것입니다)
  • 빨리 스캔하십시오
  • 성능에 따라 마지막 스캔에서 어디에서 왔는지 포인터가 있습니다.

나는 처음에 Java 나 API에 대한 경험이 거의 없을 때 코드를 작성했으며 Arraylist가 작동한다는 것을 알았 기 때문에 (최선의 선택 이었기 때문에) Arraylist를 사용했습니다.

점점 더 많은 로그가 처리되어야함에 따라 성능이 저하되고 있습니다.이 상황에서 어떤 컬렉션을 사용하는 것이 좋습니다. 항상 내 자신도 쓸 가능성이 있습니다.

감사

도움이 되었습니까?

해결책

LinkedHashSet이 관심을 가질 수 있습니다. 효과적으로 해시 세트이지만 예측 가능한 반복 순서를 허용하기 위해 링크 사전 목록을 유지하므로 FIFO 대기열로도 사용할 수 있으며, 중복 항목을 포함 할 수없는 멋진 추가 이점이 있습니다.

해시 세트이기 때문에 검색 (스캔과 반대로)은 O (1)가 일치 할 수있는 경우 O (1)가 될 수 있습니다. equals()

다른 팁

링크 사전 목록이 가장 적합 할 것입니다. 요청 된 모든 속성이 있으며 Arraylist에 필요한 선형 시간이 아닌 일정한 시간 내에 링크를 중간에서 제거 할 수 있습니다.

제거 할 다음 요소를 찾기위한 특정 전략이있는 경우 우선 순위 또는 정렬 된 세트가 더 적절할 수 있습니다.

스캔 된 것은 일반적으로 어떤 종류의 해시 기반 구현을 의미하며, ConcurrentsKipListMap은 좋은 구현 일 수 있습니다. 로그 (n) 함유 키에서, 제거 및 메소드를 가져오고, 정렬되어 정렬되어 어떤 종류의 우선 순위를 가질 수 있습니다.

나는 읽는 줄을 정렬하고 싶지 않다 (원래 순서로 유지해야한다). 그러나 각 로그인 된 라인에있는 세션 ID (세션 당 로그인 한 줄)를 기반으로 라인을 차단할 수 있습니다.

그것에 대해 생각하면 잠재적으로 다음을 가질 수 있습니다.

HashMap<String,LinkedList<String>>

세션 ID를 키로 제공하고 링크 사전 목록을 세션에 속하는 줄로 채 웁니다.

맵은 세션 X와 관련된 라인을 빠르게 검색하는 방법을 제공 한 다음 링크 된 목록은 선을 추가 / 제거하는 최상의 성능을 제공합니다 (검색 성능은 세션 X와 관련된 라인을 찾는 것이 었습니다. 세션 X와 관련하여 처음부터 끝까지 읽고 제거 할 수 있습니다.

크기를 조정하고 끝에 라인이 추가되고 항상 처음부터 가져 오는 링크 된 목록보다 더 나은 컬렉션이 있습니까? 어쨌든 큐 컬렉션이 링크 된 목록을 확장한다고 생각합니까?

세트에서 요소를 제거하고 추가하고 특정 값을 검색해야하기 때문에 더 나은 구조는 TreeSet과 같은 SortedSet을 구현하는 것일 수 있습니다. 이 클래스는 추가, 제거 및 포함 된 로그 (N) 성능을 보장합니다.

나는 일부 스레드가 대기열에 쓸 것이라고 생각하고 다른 스레드는 그것을 읽을 것입니다.

이 경우 java.lang.concurrent 패키지의 대기열을 살펴 봐야합니다.

PriorityBlockingqueue를 사용하여 요소를 주문하거나 링크드 블록 큐어를 반복하고 제거 할 요소를 선택할 수 있습니다.

AVI에 동의하고 링크 된 목록이 최선의 선택입니다. 쉽게 크기를 조정하고 목록의 끝에 빠르게 추가하고 어디서나 빠르게 제거 할 수 있습니다. 검색은 빠르지 않지만 다른 미 풀린 목록보다 나쁘지 않습니다.

구아바 도움이 될 수 있습니다.

Guava 프로젝트에는 자바 기반 프로젝트에서 컬렉션, 캐싱, 프리미티브 지원, 동시성 라이브러리, 일반적인 주석, 문자열 처리, I/O 등의 Google 핵심 라이브러리가 포함되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top