我使用ADO(C ++)连接到数据库,我正在阅读大约5米记录的表,我想限制客户端的内存使用量。目前,迭代记录会导致进程内存增加1GB,我希望能够显着降低这一点。
代码是非常标准的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();
}
我观察到的是,当它遍历记录时,内存使用率线性增加,大约每百万条记录200MB。
我想做的是:在处理时,告诉记录集释放已经处理过的记录的内存,以便保持较低的内存使用率。有没有这样做的功能?
如果没有,我可以采用手动方法将数据分区为多个记录集,并在我去的时候释放它们吗?
答案 0 :(得分:0)
我的解决方案是手动释放数据。每N条记录,我关闭记录集,并从下一条记录开始执行新查询。它需要对我的查询进行一些更改...


 int partitionSize = 100000,nRecordIndex = 0;
 CString query(“select CARD_NUM,SEQ_NUM from CMS_CARD按CARD_NUM,SEQ_NUM“)排序;
 DoSelect(theCWIDatabaseManager.GetConnection(),pRecordSet,query);
 pRecordSet-> MoveFirst();

 while(!pRecordSet) - > EOF)
 {
 //处理数据

 nRecordIndex ++;
 if(nRecordIndex%partitionSize == 0)
 {
 pRecordSet->关闭();
 query.Format(“从CMS_CARD中选择CARD_NUM,SEQ_NUM,其中CARD_NUM ='%s'和SEQ_NUM>'%s'联合选择CARD_NUM,来自CMS_CARD的SEQ_NUM,其中CARD_NUM>'%s'按CARD_NUM排序,SEQ_NUM”,lastCardNum, lastSeqNum,lastCardNum);
 DoSelect(theCWIDatabaseManager.GetConnection(),pRecordSet,query);
 pRecordSet->的MoveFirst();
 }
}



 不像记录集释放内存那样优雅,但似乎有效。