Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 限制ADO记录集的内存使用_C++_Database_Memory_Ado - Fatal编程技术网

C++ 限制ADO记录集的内存使用

C++ 限制ADO记录集的内存使用,c++,database,memory,ado,C++,Database,Memory,Ado,我正在使用ADO(C++)连接到一个数据库,我正在读取一个包含大约500万条记录的表,我想限制客户端的内存使用。目前,遍历记录会导致进程内存增加约1GB,我想显著降低这一点 >代码是非常标准的C++ ADO(编辑可读性): 我观察到的是,当它遍历记录时,内存使用量呈线性增加,大约为每百万条记录200MB 我想做的是:在处理过程中,告诉记录集释放已经处理过的记录的内存,这样内存使用率就可以保持较低。有什么功能可以做这个吗 如果没有,我是否可以采用手动方法将数据与多个记录集进行分区,并在执行时释放

我正在使用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();
    }
}