2012-08-23 3 views
1

제 애플리케이션에서 엄청난 양의 데이터를 읽어야합니다. 모든 데이터를 얻은 후에 목록에 넣고 처리하고 이에 따라 작업합니다.가장 효율적인 방법으로 데이터베이스에서 엄청난 양의 데이터 가져 오기

이제 데이터베이스 작업에서 데이터를 가져 오는 속도를 높이기 위해 무엇인가 할 수 있는지 궁금합니다. 내 데이터베이스가 다른 서버에 앉아서 자바와 상호 작용하여 데이터베이스와 작업하고 있습니다.

데이터의 한정된 크기, 즉 처리해야하는 특정 수의 행이 없습니다. 또한 나는 멀티 스레딩을 할 수 있다고 들었지만, 어떻게 그것에 대해 어떻게해야합니까? 이후로 나는 내 데이터를 분할하는 방법을 알지 못하기 때문에 무기한입니다. 즉

for(i=0 to number of partition) // Not certain on the number of partitions 
    create new thread and get data. 

을 적용 할 다음 의사 코드는 경우 아니면 내가지도의 특정 인덱스를 가져 오기 위해 각 스레드에게 나중에 몇 가지 속성을 기준으로 데이터를 해시 할 수 있습니다,하지만 나는 그것을 어떻게지도 않는다 심지어 데이터를 가져 오기 전에?

가능한 모든 해결책을 찾아 볼 수 있으며 어떻게 해결할 수 있습니까? 더 자세한 정보가 필요하면 알려주세요.

감사합니다.

+0

데이터의 양은 어느 정도입니까? 대신 데이터베이스에서 일부 처리를 수행 할 수 있습니까? 현재 병목 현상은 무엇입니까? –

+0

제가 생각하기에, 데이터를 가져 오는 다중 쓰레드가 좋은 선택입니다. 단일 스레드가 가져올 총 레코드 수를 제공해야하는 모델을 작성할 수 있습니다. –

답변

3

내가 멀티 스레딩을 할 수 있다고 들었지만 어떻게해야합니까?

이것은 원격 서버에서 정보를 쿼리하는 속도를 높이는 좋은 방법입니다.
일반적으로 이러한 작업에서 - 서버의 IO가 주요 병목 지점이며 멀티 스레딩을 통해 여러 행을 동시에 요청할 수있어 IO 대기 시간을 줄이는 효과가 있습니다.

그런데 어떻게해야합니까?

아이디어는 작업을 더 작은 작업으로 분할하는 것입니다. 자세한 내용은 Java high level concurrency API을 참조하십시오.
한 가지 해결책은 각 스레드가 서버에서 크기 M의 청크를 읽도록하고 스레드 (서버)에 데이터가있는 동안 각 스레드에 대해 프로세스를 반복하는 것입니다. (각 스레드에 대한) 그런 식으로 뭔가 :

data = "start"; 
int chunk = threadNumber; 
while (data != null) { 
    requestChunk(chunk); 
    chunk += numberOfThreads; 
} 

나는 당신이 한 번 "바인딩에서"서버가 null (또는 requestChunk() 프로세스를 반환를 null) 반환 가정한다.

아니면 내가 몇 가지 속성을 기준으로 데이터를 해시 수 있으며, 나중에지도의 특정 인덱스를 가져 각 스레드에게 당신이 데이터를 반복, 그리고 모두를 검색해야하는 경우

그것은 해시가 일반적으로 나쁜 해결책입니다. 이것은 매우 비효율적 인 캐시이고 오버 헤드는이 경우에 너무 크다.

+0

hw 여기에서 멀티 스레딩에 대해 알아 보겠습니다. 친절하게 의사 코드를 참조하십시오. 내가 무엇을 할 수 있을지?감사합니다 – Kraken

+0

@ 크라켄 : 나는 그것을 편집 - 더 명확한가요? – amit

+0

예. 감사 :) – Kraken

관련 문제