2012-10-03 4 views
6

현재 대규모 데이터 세트에서 여러 정보 검색 및 분류 작업을 수행해야하는 Java 프로젝트에서 작업하고 있습니다. 소규모 컬렉션에는 10K 개의 문서가 있습니다. 각 문서에서 복식의 150 개의 차원 벡터를 약 100 개. 약 150 만화 소 또는 150M 복식입니다. 저장 한 후에는 전체 또는 일부를 불러 와서 클러스터링 (예 : KMEANS)을 수행해야합니다. 실제 컬렉션에는 더 많은 문서가 있습니다 (현재 200,000 개의 문서를 다루고 있습니다).Java로 대용량 데이터 세트를 저장하고 검색하는 가장 좋은 방법

물론 OutOfMemoryError를 여러 번 처리했으며이 문제에 대한 마지막 해결책은 총 크기가> 5GB 인 10 개의 거대한 XML 파일에 저장하는 것이 었습니다. DOM Writer가 메모리를 가득 채 웠기 때문에 파일은 10이어야했습니다. 나는 SAX Parser를 사용하여 메모리에로드하지 않고 작업을 수행했습니다. 또한 어떤 종류의 텍스트에 두 배를 저장하면 실제 크기가 곱해지고 파싱 및 변환의 계산 비용이 추가됩니다. 마지막으로 클러스터링 알고리즘은 일반적으로 반복적이므로 동일한 데이터를 반복해서 필요로합니다. 내 방법은 아무 것도 캐시하지 않았고 디스크에서 여러 번 읽습니다.

이제 데이터 양을 데이터베이스 (원시 이진 파일 등)와 효율적인 방법으로 저장하는보다 간단한 방법을 찾고 있습니다. 누구든지 제안 할 아이디어가 있습니까?

답변

4

내장 데이터베이스 또는 키 - 값 저장. 그 중 다수가 있습니다 (예 : JDBM3. 그리고 XML 형식으로 저장하는 이상한 아이디어는 무엇입니까? 표준 직렬화 기술을 사용하여 파일에 배열을 단순히 덤프 할 수 있습니다.

+1

JDBM3이 [MapDB] (http://www.mapdb.org/)로 더 잘 알려진 JDBM4로 업그레이드되었습니다. –

0

이 목적으로 Derby를 사용하지 마십시오. 500k 개 이상의 항목을 저장하는 것은 너무 느리고 너무 많은 메모리를 사용합니다.

1

"대용량 데이터 처리"에 대해 우리는 noSQL DB를 사용해야하고 매우 잘 작동합니다.

+0

일반적으로 Big Data 방식을 사용하여이 대답을 확장 해 보겠습니다. 매우 큰 파일을 처리하려면 hadoop을, 데이터를 보관하는 NoSQL 데이터베이스 (@jakub.petr 당)를 찾으십시오. –

0

인 메모리 데이터 그리드가 문제를 해결할 수 있습니다. 몇 가지 오픈 소스 솔루션을 사용할 수 있습니다 (Hazelcast, Infinispan).

저는 아직 헤이젤 캐스트에서만 작업 했으므로 다른 것들에 대해서는 말할 수 없습니다.

Hazelcast는 여러 노드로 데이터를 확산합니다. 또한 쿼리는 클러스터의 모든 노드에 분산됩니다.

관련 문제