限制ADO记录集的内存使用

Limiting memory-usage of ADO recordset

本文关键字:内存 ADO 记录 限制      更新时间:2023-10-16

我正在使用ADO(C )连接到数据库,我正在阅读约5M记录的表,我想限制客户端的内存使用。当前,通过记录进行迭代会导致该过程中大约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。

我想做的是:在处理时,告诉记录集以释放已经处理过的记录的内存,以使内存使用量保持低。是否有一个功能可以执行此操作?

如果没有,我可以采用手动方法用多个记录集对数据进行分区,并在我走时释放它们?

我对此的解决方案是手动释放数据。每个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();
    }
}

不像记录集释放记忆一样优雅,但似乎有效。