问题:List datas = new ArrayList<>;//这个list中有几百条数据,现在要对这个集合中的数据进行加工处理,一次性进行循环处理消耗内存太大,如何进行分批处理?
第一种写法:
int size=100;
int n=(datas.size()-1)/size+1; //一次处理100条,循环几次
for (int i = 0; i < n; i++) { //循环几次100条
//每100个订单进行分批处理,避免数据量过大,内存使用过多
// TODO 还可以优化成多线程进行处理
int s=i*size; //截取数据的开始数下标
int e=(i+1)*size>datas.size()?datas.size():(i+1)*size; //截取数据的末尾数下标
List<BalanceAndPrepayReportVO> subList=datas.subList(s,e);
//对数据进行业务逻辑处理逻辑
subList.stream().map(ServiceOrderVo::getSn).distinct.collect(Collectors.joining(","));
}
第二种:
int threadSize = 500;//每500条数据处理
int remainder = list.size()%threadSize; //取余
int threadNum = 0; //循环次数
if(remainder == 0){ //能和五百整除
threadNum = list.size()/threadSize; //可以循环几次
} else {
threadNum = list.size()/threadSize + 1; //可以循环几次
}
for(int i=0;i<threadNum;i++){
if(i == threadNum - 1){ //最后一次循环,处理的数据
sList = list.subList(i*threadSize, list.size());
} else {
sList = list.subList(i*threadSize, (i+1)*threadSize); //1至n-1次的循环处理数据
}
}