2017-02-24 10 views
0

ADO (C++)를 사용하여 데이터베이스에 연결하고 약 5m 레코드의 테이블을 읽었으며 클라이언트 측 메모리 사용을 제한하려고합니다. 현재 레코드를 반복하면 프로세스에서 약 1GB의 메모리 증가가 발생하며이를 크게 줄이려고합니다. ADO 레코드 세트의 메모리 사용 제한

코드

는 (읽기 쉽도록 편집) 매우 표준 C++ ADO입니다 :

ADODB::_ConnectionPtr m_pConnection; 
m_pConnection.CreateInstance(__uuidof(ADODB::Connection)); 
m_pConnection->Open(_bstr_t(strConnect), m_strDBUserName, m_strDBPassword, -1); 

ADODB::_RecordsetPtr pRecordSet; 
pRecordSet.CreateInstance(__uuidof(ADODB::Recordset)); 

pRecordSet->putref_ActiveConnection(pConnection); 
pRecordSet->Open(_variant_t(bstrQuery), vNull, ADODB::adOpenForwardOnly, ADODB::adLockOptimistic, ADODB::adCmdText); 

pRecordSet->MoveFirst(); 
while(!pRecordSet->EOF) 
{ 
    CString cardNum = (LPCWSTR)(pRecordSet->Fields->GetItem("CARD_NUM")->Value.bstrVal); 
    int nSeqNum = pRecordSet->Fields->GetItem("SEQ_NUM")->Value.intVal; 

    // process data 

    pRecordSet->MoveNext(); 
} 

내가 관찰하는 것은, 그것은 만 개 기록 당 2백메가바이트에서 레코드를 선형, 메모리 사용량 증가를 반복 할.

내가 원하는 것은 : 처리하는 동안 레코드 집합에 이미 처리 된 레코드의 메모리를 확보하여 메모리 사용량을 낮게 유지하는 것입니다. 이것을 할 수있는 함수가 있습니까?

그렇지 않은 경우 여러 개의 레코드 세트를 사용하여 데이터를 파티션 분할하는 수동 방법을 사용할 수 있습니까?

답변

0

내 솔루션은 데이터를 수동으로 해제하는 것이 었습니다. 모든 N 개의 레코드는 레코드 세트를 닫고 다음 레코드에서 시작하는 새 쿼리를 수행합니다. 그것은 기록 세트가 메모리를 해제하는 것처럼

int partitionSize = 100000, nRecordIndex = 0; 
CString query("select CARD_NUM, SEQ_NUM from CMS_CARD order by CARD_NUM, SEQ_NUM"); 
DoSelect(theCWIDatabaseManager.GetConnection(), pRecordSet, query); 
pRecordSet->MoveFirst(); 

while(!pRecordSet->EOF) 
{ 
    // process data 

    nRecordIndex++; 
    if(nRecordIndex % partitionSize == 0) 
    { 
     pRecordSet->Close(); 
     query.Format("select CARD_NUM, SEQ_NUM from CMS_CARD where CARD_NUM = '%s' and SEQ_NUM > '%s' union select CARD_NUM, SEQ_NUM from CMS_CARD where CARD_NUM > '%s' order by CARD_NUM, SEQ_NUM", lastCardNum, lastSeqNum, lastCardNum); 
     DoSelect(theCWIDatabaseManager.GetConnection(), pRecordSet, query); 
     pRecordSet->MoveFirst(); 
    } 
} 

우아하지 ... 내 쿼리에 약간의 변화를 필요하지만 작동하는 것 같다.