限制ADO记录集的内存使用
Limiting memory-usage of ADO recordset
我正在使用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();
}
}
不像记录集释放记忆一样优雅,但似乎有效。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 限制ADO记录集的内存使用
- 在构建ADO记录集时将数据拉入内存