先说我的背景:我的情况是从iotdb中查询数据,然后解析成需要的格式 通过SXSSFWorkbook导出到excel,实验数据频次n*5000/s,n表示我本次实验选择的通道数量,可想而知我几分钟的实验就会有几百万的数据,并且要对数据进行解析然后画表导出。
再说遇到的问题:
1.大数据量势必出现导出性能问题
我尽量优化了每一步的代码,但是一次次测试随着实验时间的增加,性能始终是个瓶颈,前端不可能无限制增加超时时间,SXSSFWorkbook也不支持多线程和异步操作。
解决办法:最后我想了个办法边做实验边画表,当实验结束的时候直接生成excel,那么前端点击下载的时候我只是把这个已经生成的文件直接给他下载就ok了,下面是具体的代码:
1.1创建一个Schedule定时任务
@Slf4j
public class EventBasedScheduler {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private final ScheduledFuture<?> scheduledTask;
private SessionPool sessionPool;
private volatile boolean running = false;
private String peName="";
private Integer rowNum= 0;
private SXSSFWorkbook workbook = new SXSSFWorkbook();
// private FZProjectExperimentEntity experimentEntity;
private long startTimestamp;
private List<String> channels;
public EventBasedScheduler(long initialDelay, long period, TimeUnit unit) {
scheduledTask = scheduler.scheduleAtFixedRate(() -> {
if (running) {
// 这里执行定时任务
log.inf