当前位置: 首页 > news >正文

多文档快速合并

在有多CPU的情况下,充分发挥多CPU的性能,可以采用如下方式进行文档合并,合并效率显著提升。int numCpus = Runtime.getRuntime().availableProcessors();
log.info("CPU内核数:"+numCpus);
List<byte[]> tempFiles = mergeDocumentsInChunks(files, numCpus);log.info("合并所有部分");
com.spire.doc.Document finalDocument = new Document();
int i = 0;
for (byte[] tempFile : tempFiles) {log.info("合并所有部分,合并保存第{}个分块,共{}个分块.............",++i, tempFiles.size());InputStream inputStream = new ByteArrayInputStream(tempFile);finalDocument.insertTextFromStream(inputStream, FileFormat.Docx_2013);
}log.info("合并文件开始保存到磁盘:" + mergDoc);
finalDocument.saveToFile(mergDoc, FileFormat.Docx_2013);
log.info("保存成功");
return finalDocument;
public static List<byte[]> mergeDocumentsInChunks(List<Path> files, int numCpus) throws Exception {int numFiles = files.size();int chunkSize = Math.max(1, numFiles / numCpus);List<List<Path>> fileChunks = new ArrayList<>();for (int i = 0; i < numFiles; i += chunkSize) {fileChunks.add(files.subList(i, Math.min(i + chunkSize, numFiles)));}log.info("文件分块:将所有文件路径按CPU核数分块,每个分块包含一部分文件,共"+fileChunks.size()+"个块,每块文件数:"+chunkSize+"共\"+numFiles+\"个文件");log.info("使用并行合并文档");ExecutorService executor = Executors.newFixedThreadPool(numCpus);List<Future<byte[]>> futures = new ArrayList<>();for (int i = 0; i < fileChunks.size(); i++) {List<Path> chunk = fileChunks.get(i);futures.add(executor.submit(() -> mergeDocuments(chunk)));}List<byte[]> tempFiles = new ArrayList<>();for (Future<byte[]> future : futures) {tempFiles.add(future.get());}executor.shutdown();return tempFiles;
}
public static byte[] mergeDocuments(List<Path> filePaths) throws Exception {Document combinedDocument = new Document();for (Path filePath : filePaths) {log.info("并行文档合并中......{}",filePath.toString());combinedDocument.insertTextFromFile(filePath.toString(), FileFormat.Docx_2013);}ByteArrayOutputStream outputStream = new ByteArrayOutputStream();combinedDocument.saveToStream(outputStream, FileFormat.Docx_2013);return outputStream.toByteArray();
}


http://www.mrgr.cn/news/59510.html

相关文章:

  • Unity中使用UnityEvent遇到Bug
  • 贪心算法与分数背包
  • ArcGIS计算多个面要素范围内栅格数据各数值的面积
  • MAN Truck Bus EDI 需求分析
  • Springboot 整合 Java DL4J 实现智能客服
  • Maven的简单认识 4-Maven插件
  • LeetCode题练习与总结:回文对--336
  • 008:光盘映像文件处理工具UltraISO安装教程
  • Python实现基于HANTS算法(时间序列谐波分析法)的长时间序列数据去噪、重建、填补
  • 【汇编语言】第一个程序(二)—— 带你真正了解一个源程序的结构是怎样的
  • 背包九讲——二维费用背包问题
  • 基于SSM平面设计课程在线学习系统的设计
  • 504 Gateway Time-outopenresty
  • 684. 冗余连接
  • w~视觉~合集10
  • 深度学习模型预测控制python tensorflow 实现
  • Rust 力扣 - 3. 无重复字符的最长子串
  • Spring Cache-基于注解的缓存
  • 以蚂蚁借呗、抖音放心借、美团借钱为例,聊聊企业如何计算期末资产收益率
  • C++和OpenGL实现3D游戏编程【连载16】——详解三维坐标转二维屏幕坐标(向量和矩阵操作实战)
  • (六)问题记录,simulink仿真出现模型碰撞后穿越
  • 【ChatGPT】如何利用ChatGPT进行复杂任务的分解
  • 100种算法【Python版】第13篇——埃拉托斯特尼素数筛法
  • 信息安全入门——网络安全威胁
  • list补充
  • apply,call,bind手写