总结一下这两天的工作

主要是spg项目的数据库,把casset表中的数据导入到virtualObj表。

开始用的算法:List<Casset> list=cassetManager.findAll();把casset中的记录全部取出来(取到内存),然后逐条与virtualObj中的记录比较virtualObjManager.findVirtualObjByAssetIdAndTypeId(*,*);,然后插入。
导致问题:
1.一次取出全部casset的记录(130000条)数据量太大,内存不够,堆溢出;
2.而且每插入一条数据都要遍历virtualObj表做比较避免数据重复,当virtualObj表记录逐渐增多时操作越来越慢。

改进:
算法:减小list的大小,List<Casset> list=cassetManager.findByConferenceId();每次取一个会议的论文插入virtualObj,解决了问题一,但问题二仍然存在,太慢,不可行。

改进二:
问题二是导致插入太慢的主要原因,因此要避免每插入一条数据都要遍历virtualObj并和每一条数据进行比较的操作,具体采用了如下算法:采用一个标志数组flag[140000]初始为0,下表代表casset表中的id号;VirtualObj中已存在的论文就将flag置1,这样在从 casset中取一条记录(主键id)插入VirtualObj的时候就不用再遍历VirtualObj进行比较,只要看flag[id]为0,则插入,为1 则数据已存在。(速度提高了很多啊)

同时,在对flag数组进行设置时,VirtualObj表中的数据要分段取出,每次取5000个(一次全部取出的话会占用过多的内存,速度变慢)。

最终代码:
int[] flag=new int[140000];
for(int j=0;j<140000;j++)
flag[j]=0;

//取出assetId在70000-140000范围内的记录,共3000多条
//这里只给出了一个分段70000-140000范围
List<VirtualObj> list1=virtualObjManager.findVirtualObjBySiteIdAndRange(5, 70000, 140000);
Iterator<VirtualObj> it1=list1.iterator();
while(it1.hasNext()){
int assetid=it1.next().getAssetId();
flag[assetid]=1;
System.out.println("++++:assetId="+assetid+"===:"+flag[assetid]+" ---"+virtualObjManager.findVirtualObjByAssetIdAndTypeId(assetid, 5).get(0).getName());
}


//执行插入操作
for(int id=70000;id<140000;id++){
if(flag[id]==0){
Casset casset=cassetManager.findCassetById(id);
if(casset!=null){
VirtualObj obj=new VirtualObj();
obj.setAssetId(casset.getId());
obj.setTypeId(5);
obj.setCreateTime(casset.getCreatetime());
obj.setModifiedTime(casset.getLastmodifytime());
obj.setAcl(700);
obj.setName(casset.getTitle());
obj.setFilePath(casset.getPdf_url());
obj.setSecondName(casset.getPdf_url());
obj.setType("pdf");
obj.setIcon("pdf");
obj.setCategory("文档");
virtualObjManager.addVirtualObj(obj);
System.out.println("++++:Id="+id+"---"+casset.getTitle());
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值