2010-07-09 3 views
1

데이터베이스에서 많은 양의 데이터를 가져 와서 반복 계산을 수행하는 작은 스크립트가 있습니다. 이 계산에는 약 2500 개의 행이 사용되므로 엄청난 양은 아니지만 상사가 어쨌든 계산을 나누기를 원합니다.큰 계산을 분할 하시겠습니까?

내 일반적인 전략 (그리고 나는 단지 어둠 속에서 촬영 중이다.) 데이터베이스를 두드려서 처음 50 개 행을 얻고, 50 개 행에 대한 계산에서 각 단계를 수행하고 마지막 행을 저장한다. 반복), 데이터베이스에서 다음 50 개의 행을 가져 와서 데이터베이스의 모든 행에 대한 설명이 완료 될 때까지이 프로세스를 계속하십시오.

내 전략에 대한 생각? 이런 종류의 일을하기위한 조언?

+0

파티션을 지정하지 않고 계산을 일괄 처리합니다. 그래서 그것은 어느 것이 될까요? –

+1

내 전략이 의미하는 바를하고 싶습니다. 잘못된 용어를 사용하면 유감입니다. 두 파티션의 차이점이 명확하지 않기 때문에 분할이 무엇인지 알기에 관심이 있습니다. – sooprise

+0

파티션을 분할하는 데는 멀티 스레딩이 필요합니다. – Dykam

답변

1

내가 프로그래밍에서 배운 첫 번째 것 중 하나는 코드 작성 방법을 모를 때 먼저 단계별로 해결할 프로세스 (알고리즘)를 작성한 다음 그것을 코드로 변환하는 방법을보십시오.

좋은 첫발자와 같은 소리는 파티셔닝에 대한 걱정없이 종이에서 문제를 해결하는 방법을 작성하는 것입니다. 나는 당신의 문제가이 사소한 것이 아니라는 것을 알고 있습니다. 그러나 나는 합산의 예를 사용할 것입니다.

모든 레코드의 합계를 찾으려면 record0 + record1 + record2 + ... + record2499 = Sum을 사용합니다.

그걸로, 당신은 그때 그것이 분할 될 수 있는지 보러 갈 수 있습니다. 추가를 위해서는 추가가 연관되어 있기 때문에 쉽게 완료 할 수 있습니다. 작업을 그룹화하십시오. 하나의 파티션입니다.

이제 계산을 수동으로 파티션 할 수있는 방법을 찾지 못하면 코드에서 파티션을 나누기가 어려울 것입니다.

그러나 첫 번째 단계는 수동으로 해결 한 다음 파티션 가능성을 찾아 보는 것입니다.

-2

데이타베이스 cursors (느릴 수 있음) 또는 while loop or other alternatives과 같은 소리가납니다.

+0

-1 커서를 언급합니다. – Brian

+0

hehe ... 그냥 "Peer Pressure"배지를 기다리는 중입니다. (덧붙여 말하자면, T-SQL은 LIMIT와 OFFSET과 같은 유용한 용어를 가지고 있지 않다는 사실에 놀라움을 금치 못합니다.) – ewall

+0

T-SQL은'top'을 가지고 있지만 실제로 도움이되지 않습니다. T-SQL은 rownumber()를 통해 (colname by order by colname) 행을 통해 페이지 매김을 수행 할 수 있으며'where' 절을 사용하면 반환되는 행을 제한 할 수 있습니다. – Brian

0

계산이 종속적 인 것처럼 들리지 않으므로 스레딩이 이점을 제공하는 완벽한 예입니다. T (총 레코드 수)/N 레코드에 대한 계산을 수행하는 N 개의 스레드를 만듭니다. 모든 스레드가 완료되면 한 단계를 수행하여 각 스레드에서 생성 된 모든 부분합을 결합 할 수 있습니다.

+0

내가 명확하지 않다면 미안하지만, 계산은 의존적이다. (그것은 내가 반복적으로 말한 것이다.) ... 내 용어가이 질문에 한 번 이상 나오는 것처럼 보인다. heh heh – sooprise

0

계산의 특성을 모른 채 말하기는 어렵습니다.

파티션을 만들 때 데이터/프로세스를 병렬 처리 할 수 ​​있다는 의미 - 다른 파티션이 어떤 방식 으로든 독립적이라는 것을 의미하므로 각 파티션을 독립적으로 처리 할 수 ​​있습니다.

일반적으로 나는 2500 행을 많이 생각하지 않으며, 이와 같이 데이터베이스에서 지속적인 계산 된 열을 사용하고 데이터베이스에서 처리합니다. 행이 변경되면 재 계산을위한 트리거가 필요할 수 있습니다 . 계산을 위해 데이터베이스에서 행을 끌어 당기는 것이 데이터베이스가 해당 정보를 저장하거나 즉시 계산할 수있는 경우보다 효율성이 떨어지는 경우가 종종 있습니다.

1

다음은 어떻게 수행할까요? 데이터를 처리

그리고 코드는 다음과 같을 수에 가져 오는 데이터에 대한

  • 전용 하나 개의 스레드는
  • 전용으로 하나 개의 스레드.

    public class Worker 
    { 
        private BlockingQueue<Message> m_Queue = new BlockingQueue<Message>(); 
    
        public void Start() 
        { 
        var fetcher = new Thread(() => { Fetch(); }); 
        var processor = new Thread(() => { Process(); }); 
        fetcher.Start(); 
        processor.Start(); 
        } 
    
        public void Fetch() 
        { 
        while (true) 
        { 
         var packet = GetDataPacketFromDatabase(); 
         if (packet != null) 
         { 
         var message = new Message(); 
         message.Packet = packet; 
         m_Queue.Enqueue(message); 
         } 
         else 
         { 
         break; // Stop if there is nothing left to fetch. 
         } 
        } 
        } 
    
        public void Process() 
        { 
        while (true) 
        { 
         Message message = m_Queue.Dequeue(); 
         if (message.Packet 1= null) 
         { 
         Accumulate(message.Packet); 
         } 
         else 
         { 
         break; // Stop if there is nothing left to process. 
         } 
        } 
        } 
    
        private void Accumulate(Packet p) 
        { 
        // Process the packet and accumulate the results. 
        } 
    } 
    
    나는 당신이 (내 예제에서 Accumulate 방법을 통해) 반환 된 데이터에 대한 몇 가지 심각하게 복잡한 계산을 수행하지 않는 한 다음 처리 스레드가 작업 고갈받을 것이라고 지적하고 대부분의 시간을 위해 유휴한다

    . 나는이 경우 분할 및 병렬 처리의 전제가 모든 2500 행을 한 번에 가져 와서 순차적으로 처리하는 것보다 느리다는 것을 의심합니다.

관련 문제