捌幺81 2007-9-27 11:54
pdb导入内存的问题
自己做了一个pdb的文件,打算将它从扩展卡拷到RAM
RAM剩余内存3M左右,pdb大小为500K左右。
但是当pdb的数据有8000条数据的时候,会提示内存不足,拷贝失败。
而同样大小的pdb,包含500条数据的时候,拷贝可以成功。
增加空闲内存到4M以后,都可以成功,8000条数据的pdb大小会增加到800k左右。
(通过VFSImportDatabaseFromFile() 和 手工拷贝 两种的效果相同 )
那位高手能解释下为什么吗? 如何在较少空闲内存的情况下拷贝8000数据的pdb(主要是如何通过程序实现)?
必须要改变存储结构吗?
看了些交换管理器的内容没有找到比较满意的解释。
[[i] 本帖最后由 捌幺81 于 2007-9-27 11:55 编辑 [/i]]
捌幺81 2007-9-27 14:31
下面的方法可行吗?还有什么方法解决?那种比较好?
1 能不能换一种方式从卡中拷贝数据库,我曾经试过VFS->FileStream的 但是拷贝出来的文件类型是FS的。有没有其他类似的可行方法。
2 根据卡中的文件,在内存中创建一个新的数据库,然后逐条读出、添加数据。感觉有点麻烦,还没有测试。
3 有没有办法分批加载
4 有没有办法直接拷贝,这种应该是最有效率的
5 实在不行退而求其次,程序中作一次判断,不能拷贝,就每次从扩展卡中读取。这种是没有办法的办法,效率很低。因为数据库访问频繁。
捌幺81 2007-9-28 15:19
第二种方法已经测试了,速度慢不说,同样会出现内存不足的情况,难道一个打开数据就超过了3m? 大概拷到7000条的时候内存不足退出。
error = VFSFileOpen (volumeID, dbPath, vfsModeRead, &fileRef);
if(error != errNone)
{
return false;
}
error = VFSFileDBInfo(fileRef,dbNameP,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&dbType,&dbCreator,&numRecords);
if(error != errNone)
{
return false;
}
error = DmCreateDatabase(0,dbNameP,dbCreator,dbType,false);
if(error != errNone && error != dmErrAlreadyExists)
{
return false;
}
tagDBPtr->tagDBRef = DmOpenDatabaseByTypeCreator(dbType,dbCreator,dmModeReadWrite);
if(tagDBPtr->tagDBRef == NULL)
{
return false;
}
for(index = 0; index<numRecords; index++)
{
newIndex = dmMaxRecordIndex;
error = VFSFileDBGetRecord(fileRef,index,&recordH,NULL,NULL);
if(error != errNone)
{
DmCloseDatabase(tagDBPtr->tagDBRef);
return false;
}
recordPtr = MemHandleLock(recordH);
newRecordH = DmNewRecord(tagDBPtr->tagDBRef,&newIndex,MemPtrSize(recordPtr)+1);
if(newRecordH == NULL)
{
MemHandleFree(recordH);
DmCloseDatabase(tagDBPtr->tagDBRef);
FrmCustomAlert(CommonErrorAlert,"内存不足,数据库导入失败.",NULL,NULL);
return false;
}
newRecordPtr = MemHandleLock(newRecordH);
DmWrite (newRecordPtr,0,recordPtr,MemPtrSize(recordPtr));
MemHandleUnlock(recordH);
MemHandleUnlock(newRecordH);
DmReleaseRecord(tagDBPtr->tagDBRef,newIndex,false);
MemHandleFree(recordH);
}
DmCloseDatabase(tagDBPtr->tagDBRef);
lee1980_80 2007-10-8 16:45
进来长长见识
basten1983 2008-6-1 00:54
┴oooo留名
┴oooo┬┴┬┴┬┴┬oooo┴┬┴┬┴┬
┬(踩)┴┬oooo┴┬┴(壹)┬┴oooo┬┴
┴ \_)┬┴(你)┬┴┬ \_)┴┬(腳)┴┬
┬┴┬┴┬(_/ ┬┴┬┴┬┬┴(_/┬┴┬