2009-11-04 6 views
2

큰 금액의 데이터 량에서 메모리 제한을 초과하는 20 %의 시간을 읽어야하는 응용 프로그램의 일부가 있습니다. 메모리 제한을 늘릴 수는 있지만 대부분의 시간이 필요할 때 할당량을 높여야하기 때문에 주저하지 않습니다.큰 데이터 목록을 처리하는 방법

커밋 된 java.util.List 구현을 사용하여 이와 같은 최대 부하에 도달했을 때 디스크에 스풀링 할 것을 고려하고 있지만, 더 가벼운 상황에서는 메모리에 남아있게됩니다.

데이터가 컬렉션에 한 번로드되고 이후에 반복 처리되고 처리 된 다음 삭제됩니다. 일단 컬렉션에 있으면 정렬 할 필요가 없습니다.

누구나 그런 접근 방식에 관한 찬반 의견이 있습니까?

이런 종류의 List impl을 제공하는 오픈 소스 제품이 있습니까?

감사합니다.

업데이트 :

  • 건방진 아니라,하지만 '거대한'나는 메모리의 양을 초과하는 의미에서 우리는 같은 하드웨어에서 다른 프로세스를 방해하지 않고 할당 기꺼이. 다른 세부 사항은 무엇입니까?
  • 응용 프로그램은 기본적으로 여러 데이터베이스 테이블의 데이터를로드하고 이에 대한 광범위한 비즈니스 논리를 수행하는 배치 프로세서입니다. 집계 연산은 완료된 논리의 일부이기 때문에 목록에있는 모든 데이터가 필요합니다. 데이터 수집에 읽고있는 동안 무슨 일 STXXL equivalent in Java
+0

'거대한 양의 데이터와 메모리 제한을 더 잘 정의 할 수 있습니까? –

답변

6

정말 목록을 사용해야합니까? 대신에 데이터를 단계별로 처리하는 Iterator 구현을 작성하십시오 (AbstractIterator을 확장하는 데 도움이 될 수 있음). 그런 다음 해당 반복자와 함께 유용한 유틸리티 인 like these을 사용할 수 있습니다. 이 중 어느 것도 엄청난 양의 데이터가 메모리에 열심히로드되지 않습니다. 대신 반복기가 고급화 될 때만 소스에서 레코드를 읽습니다.

+0

이것은 분명히 옵션이며, 우리는 진지하게 고려하고 있습니다. 내가 바라는 건 메모리에서 읽거나 내부 버퍼를 초과 할 때 디스크에서 읽을 수있는 반복자 (또는리스트) 구현이다. –

+0

글쎄, 그냥 InputStream에서 읽는다면, BufferedInputStream이 버퍼를 처리한다. –

0

정렬 있는가/처리 :

  • 난 그냥 아주 좋은 옵션을 제공이 게시물을 가로 질러왔다? 어디서 읽었습니까?

    디스크에서 이미 읽는 경우 목록에서 완전히 읽은 다음 반복하는 대신 디스크에서 직접 일괄 처리 할 수 ​​있습니까? 데이터의 상호 의존성은 어떻게됩니까?

  • +0

    목록의 각 요소는 도메인 개체이며 각 요소에 대한 관련 개체의 계층 구조가 있습니다. 그것은 다양한 쿼리의 여러 (15-25) 데이터베이스 테이블에서 읽혀지고 일부는 캐싱되고 일부는 그렇지 않습니다. –

    2

    엄청난 양의 데이터로 작업하는 경우 데이터베이스를 대신 사용해보십시오.

    +0

    +1. 특정 결과 집합 만 반환하는 쿼리와 함께 데이터베이스가 더 좋은 아이디어 일 수 있습니다. – BalusC

    +0

    데이터는 약 20 개의 서로 다른 테이블에 걸쳐 데이터베이스에 저장되며 응용 프로그램 실행의 다양한 지점에로드되며 각 데이터 포인트에는 다양한 만료 날짜가 있습니다. 애플리케이션의 특정 부분은 본질적으로 병목 현상 (설계 불량)이며 많은 양의 데이터가 거기에 있습니다. –

    +0

    데이터베이스 기반 수집 (Kevin Bourrilion의 제안과 광산의 조합)을 사용하여 제안 하겠지만 업데이트 된 질문을 읽은 후에는 독자적으로 찾은 다른 솔루션 중 하나처럼 보입니다. – rob

    1

    데이터베이스에 백업하고 항목을 지연로드하십시오.

    ORM 프레임 워크가 순서 일 수 있습니다. 그것은 당신의 사용법에 달려 있습니다. 꽤 똑바로 될 수도 있고, 악몽 중 최악의 상황 일 수도 있습니다.

    나는 낙관주의 그리고 난 (예 : 최대 절전 모드와 같은) ORM 프레임 워크를 사용하여 약 3 문제를 해결할 것이라고 생각 - 당신은 메모리에 모든 데이터를로드해야하는 이유도 의문을 제기 할 오일

    +0

    그렇다면 반복 할 때 항목을 제거해야합니다. 그렇지 않으면 항목이 메모리에 남아있게됩니다. :) – OscarRyz

    +0

    지금까지 최선의 아이디어. SQL의 마법으로 검색이나 스캐닝을 처리하십시오! 또한 귀하의 업데이트가 얼마나 논쟁의 여지가 있는지에 따라 많은 컴퓨터에서 솔루션을 확장 할 수 있습니다. –

    0

    그것을 처리합니다. 일반적으로로드 될 때 처리를 수행 한 다음 그 결과를 사용할 수 있어야합니다.그러면 실제 데이터가 메모리에서 제외됩니다.

    +0

    집계 연산을 데이터에서 수행해야합니다. –

    +0

    데이터를로드하는 동안 집계를 수행 할 수 있습니다. 중개자 iter = ... int sum = 0; while (iter.hasNext()) { sum + = iter.next(); } return sum; –

    +0

    단순한 합계보다 더 복잡합니다. 데이터에 대한 작업을 언제 어디서 할 수 있는지에 대한 광범위한 논리가 있습니다. (도메인은 다양한 금융 상품에 대한 금융 거래 회계입니다.) –

    관련 문제