2010-12-06 5 views
0

현재 추가 작업을 위해 많은 양의 데이터를 선택해야하는 응용 프로그램의 일부에서 작업 중이며 I/O가 제한되어 있으며 다음과 같은 작업. 내 생각은 이러한 모든 개체를 메모리에 있지만 압축 된 일련 번호를 갖게되었습니다. 문제는 이와 같은 객체에 액세스하는 것이 직접적인 데이터베이스 액세스보다 빠르며 좋은 아이디어인지 아닌지 여부입니다. (이 메모리 소비의 측면에서 feasble 인 경우 = 직렬화 된 형식은 일반 개체보다 적은 메모리를 사용)직렬화 및 압축 된 개체 유지 메모리 내

편집 2011년 2월 :

객체의 생성이 느린 부분이 아닌 데이터베이스 액세스 자체입니다. 모든 것을 메모리에 저장하는 것은 불가능하며 ehcache 옵션을 사용하여 "디스크 오버 플로우"옵션을 사용하면 데이터베이스에서 데이터를 가져 오는 것보다 실제로 속도가 느립니다. 표준 자바 직렬화도 사용할 수 없습니다. 그것은 또한 훨씬 더 느립니다. 기본적으로 내가 할 수있는 일은 아무것도 없습니다 ...

+2

얼마나 "많은"인가? –

+0

내 "테스트 케이스"에서 수천 개의 행이 30k 행입니다. 것은 1 ~ 30k 또는 그 이상이 될 수있는 ID (기본 키) 목록입니다. 처음에는 거대한 SQL IN Clause를 만들었습니다. 실제로는 수천 GB의 메모리를 동등하게 소비한다는 점에서 좋은 평가를 받았습니다. 이제 각 요소 분리를 선택합니다. 물론 그것은 부정적인 영향을 주었지만 메모리 사용량이 10 배 적은 것과 비교하면 꽤 작은 것입니다. 그것은 특별한 검색이므로 "빠름"이어야합니다. –

+0

사용자 지정 serialization/deserialization을 시도 했습니까? –

답변

0

큰 개체 인 경우 압축 된 직렬화 된 형식은 메모리를 적게 사용합니다. 그러나 작은 물체의 경우. 프리 티브를 사용합니다. 원본 개체는 훨씬 작아집니다.

먼저이 작업을 수행해야하는지 여부를 먼저 확인합니다. 예 : 더 많은 메모리를 소비 할 수 있습니까? 객체를 재구성하여 메모리를 적게 사용하십시오.

+0

개체가 매우 무겁고 합리적인 숫자는 합리적인 금액의 메모리에 적합하지 않습니다. 객체는 라이브러리에서 가져온 것이므로 구조화 할 수 없습니다. –

1

기본적으로 메모리 내 캐시 또는 메모리 내 DataGrid를 찾고 있습니다. 이런 종류의 API/제품이 많이 있습니다. ehcache/hibernate chace/gridgain 등

+0

ehcache를 발견했습니다. 최대 절전 모드 없이도 사용할 수 있다고 가정합니까? –

+0

@beginner_ 제 생각에 그렇습니다. 독립형으로 사용할 수 있습니다. –

+0

ehcache 홈페이지를 보았지만 다음과 같은 질문에 대한 답변을 찾지 못했습니다. 전체 개체 또는 압축 형식을 캐시합니까? –

0

"I/O가 제한적이며 다음 작업이 아니라는 인상을받습니다."-> 나는 그러한 것을 구현하기 전에 이것에 대해 매우 확신합니다.

내가 제안 할 수있는 간단한 방법은 캐시 크기가 너무 커지면 디스크에 저장하는 옵션으로 ehcache를 사용하는 것입니다.

또 다른 완전히 다른 접근 방법은 "추가 작업은"선택한 객체를 저장하기 위해 CouchDB를 같은 일부 문서를 기반으로되는 NoSQL DB를 사용 할 수

+0

이 경우의 I/O는 디스크 접근을 의미하는 캐시 된 dataTables를 가진 HSQLDB입니다. 데이터베이스에서 읽는 별도의 스레드와 작업을 수행하기위한 스레드가 있습니다. 읽기/선택은 작은 배치로 이루어지며 대기열이 채워져 병렬로 작동합니다.그 때문에 나는 "읽기 스레드"가 100 %의 시간 동안 활성화되어있는 반면 다른 하나는 80 %의 시간을 기다리고있는 것을 볼 수 있습니다. 그러나 다른 RDBMS와 다를 수 있습니다. –

+0

저는 몇 년 전에 극 초음속을 사용 했었습니다. 빠른 개발을 위해서는 매우 좋았지 만, 특히 빠른 것으로 기억하지 않습니다. 차라리 couchdb 또는 mongodb 또는 ehcache/terracotta를 사용해 보라고 권합니다. – Uberto

+1

위의 ehcache에 대한 위의 내용을 무시하십시오. 오히려 빨리 달리고 있어요. 예제 코드에서 오류를 수정하기위한 상식이 필요합니다. 어쨌든 모든 것이 캐시에 있으면 작업 속도가 약 10 배 증가합니다. 메모리 사용이 용납 될 수 없기 때문에 객체가 압축되지 않은 것 같습니다. 그러나 당신은 여전히 ​​옳을 수도 있습니다. 실제로 시간이 많이 소요되는 부분은 데이터를 실제로 읽는 것이 아니라 객체를 생성하고 데이터를 파싱하는 것입니다 (longvarchar). 물론이 단계들은 서로 후에 발생합니다. –

관련 문제