C++ 限制ADO记录集的内存使用
我正在使用ADO(C++)连接到一个数据库,我正在读取一个包含大约500万条记录的表,我想限制客户端的内存使用。目前,遍历记录会导致进程内存增加约1GB,我想显著降低这一点 <> >代码是非常标准的C++ ADO(编辑可读性): 我观察到的是,当它遍历记录时,内存使用量呈线性增加,大约为每百万条记录200MB 我想做的是:在处理过程中,告诉记录集释放已经处理过的记录的内存,这样内存使用率就可以保持较低。有什么功能可以做这个吗C++ 限制ADO记录集的内存使用,c++,database,memory,ado,C++,Database,Memory,Ado,我正在使用ADO(C++)连接到一个数据库,我正在读取一个包含大约500万条记录的表,我想限制客户端的内存使用。目前,遍历记录会导致进程内存增加约1GB,我想显著降低这一点 >代码是非常标准的C++ ADO(编辑可读性): 我观察到的是,当它遍历记录时,内存使用量呈线性增加,大约为每百万条记录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();
}
}
不像记录集释放内存那样优雅,但似乎工作正常
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();
}
}