查看完整版本: pdb导入内存的问题

捌幺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 08:49

奇怪,同步就可以,使用一样的交换管理器啊

捌幺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┬┴
┴ \_)┬┴(你)┬┴┬ \_)┴┬(腳)┴┬
┬┴┬┴┬(_/ ┬┴┬┴┬┬┴(_/┬┴┬
页: [1]
查看完整版本: pdb导入内存的问题