package com.basic.analy.utils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.RecursiveTask; import ch.qos.logback.core.net.SyslogOutputStream; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.basic.analy.service.FaceSdkTool; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; public class EsThreadUtils extends RecursiveTask>>{ private static final int THRESHOLD = 500; private List hitArray; // private String resultJson; /** * 比对分值 */ private long likePer; /** * 人脸特征值 */ private byte[] imageData; private Logger logger = Logger.getLogger(EsThreadUtils.class); public EsThreadUtils(List hitArray, long likePer, byte[] imageData){ // this.resultJson = resultJson; this.hitArray =hitArray; this.likePer = likePer; this.imageData = imageData; } @Override public List> compute(){ List> computedList = new ArrayList<>(); // if(this.resultJson != null){ // JSONObject resp = JSONObject.parseObject(resultJson); // JSONObject hits = (JSONObject) resp.get("hits"); // JSONArray hites = (JSONArray)hits.get("hits"); // this.jsonArray =JSONArray.parseArray(hites.toJSONString(),JSONObject.class); // } boolean canFork = hitArray.size() <= THRESHOLD; if (canFork){ // boolean isPrinted = false; for (int i = 0,item = hitArray.size(); i map = JSONObject.parseObject(hit.get("_source").toString(),HashMap.class); String FaceFeature = (String)map.get("FaceFeature"); if(StringUtils.isNotEmpty(FaceFeature) && !FaceFeature.startsWith("base64")){ // byte[] feature = Base64Utils.Base64Tobyte(FaceFeature); byte[] feature = Base64.decodeBase64(FaceFeature); // long compareStartTime = System.nanoTime(); if(feature.length == 2560){ Float num= FaceSdkTool.compareFeature(this.imageData, feature); //logger.info(Math.round(num*100)+"num--------------"); // if(!isPrinted){ // isPrinted = true; // logger.info("比对得分:"+ num +"调用jni比对耗时:"+(System.nanoTime()-compareStartTime)); // } if(Math.round(num*100) < this.likePer){ //小于比对分值的数据丢弃 continue; } map.put("likePer",Math.round(num*100)); String baseName = (String) map.get("BaseName"); if(baseName!=null&&baseName.startsWith("lt_")){ map.put("BaseName", baseName.substring(3)); } Object age = map.get("Age"); if(age!=null){ int agei = -1; try { agei = (Integer)age; } catch (ClassCastException e){ agei = Integer.valueOf((String)age); } if(agei>0 && agei < 7){ age ="童年"; }else if(agei>=7 && agei < 18){ age ="少年"; }else if(agei>=18 && agei < 40){ age ="青年"; }else if(agei>=40 && agei < 65){ age ="中年"; }else if(agei>= 65){ age ="老年"; } } map.put("Age",age); map.put("timeDay",((String)map.get("picDate")).substring(0,10)); // map.put("likePer",Math.round(Math.random()*100)); // currentList.add(map); // EsThreadUtils.getCurrentList().add(map); // sum++; computedList.add(map); }else{ logger.info("feature.length:"+feature.length+",_id:"+map.get("_id")); } } } }else { // 分成step个小任务 long step = (hitArray.size()-1)/THRESHOLD+1; ArrayList subTasks = new ArrayList(); int pos=0; for (int i = 0; i < step; i++){ int start = pos ; int end = start+THRESHOLD; if (end > hitArray.size()) end = hitArray.size(); EsThreadUtils subTask = new EsThreadUtils(hitArray.subList(start, end), this.likePer, this.imageData); pos = end; subTasks.add(subTask); subTask.fork(); } for (EsThreadUtils t : subTasks) { List> taskResultList = t.join(); for(Map taskMap : taskResultList){ computedList.add(taskMap); } } } return computedList; } public static void main(String[] args) { /*SearchServiceImpl impl = new SearchServiceImpl(); Long start = System.currentTimeMillis(); System.out.println("开始!"+start); List> searchScrollData = impl.searchScrollData("videopersons", null, "2016-10-11 12:30:12","2019-10-11 12:30:12","picDate"); ElasticSearchUtil.closeClient(); Long end = System.currentTimeMillis(); System.out.println("借宿!"+end+";用时:"+(end-start)+"size:"+searchScrollData.size()); */ } // public List getJsonArray() { // return jsonArray; // } // public void setJsonArray(List jsonArray) { // this.jsonArray = jsonArray; // } // public String getResultJson() { // return resultJson; // } // public void setResultJson(String resultJson) { // this.resultJson = resultJson; // } // // public long getLikePer(){ // return this.likePer; // } }