在日常完成业务过程中,出现了要在内存中操作很大的txt的需求,文件每行作为一条数据,但是由于数据量很大,不能一次性拉入内存中操作,但是又需要使用hashmap进行去重,于是借鉴hashmap的源码,编写了简易的大txt分桶执行操作。

BufferedFactory(写入、写出流工厂类)
/*** @author cliang.griffin* @description buffered工厂类* @date 2021/12/2*/
@Slf4j
public class BufferedFactory {/*** 桶的全部文件写出流*/private static HashMap<Integer,BufferedWriter> bufferedWriterHashMap = new HashMap<>();/*** 桶的全部文件写入流*/private static HashMap<Integer, BufferedReader> bufferedReaderHashMap = new HashMap<>();/*** 桶路径设置*/private static String filePath;/*** 设置文件路径* @param filePath 文件路径*/public static void setFilePath(String filePath){BufferedFactory.filePath = "D:\\临时统计\\"+filePath;}/*** 获取该桶绑定的写出流* @param n 桶* @return 写出流*/public static BufferedWriter getBufferedWriter(int n,String fileName){new File(filePath).mkdir();if (!bufferedWriterHashMap.containsKey(n)){try {bufferedWriterHashMap.put(n,new BufferedWriter(new FileWriter(filePath+"\\"+fileName+n+".txt")));} catch (IOException e) {log.error("创建写出流失败:"+filePath+n);}}return bufferedWriterHashMap.get(n);}/*** 操作结束后关闭所有写出流*/public static void closeBufferedWriter(){bufferedWriterHashMap.forEach((key,value)->{try {value.close();} catch (IOException e) {log.error("第"+key+"个桶绑定的写出流关闭异常");}});}/*** 获取该桶绑定的写出流* @param n 桶* @param filename 桶中的文件名称* @return 写出流*/public static BufferedReader getBufferedReader(int n,String filename){if (!bufferedReaderHashMap.containsKey(n)){try {bufferedReaderHashMap.put(n,new BufferedReader(new FileReader(filePath+"\\"+filename+n+".txt")));} catch (IOException e) {log.error("创建写出流失败:"+filePath+"\\"+filename+n+".txt");}}return bufferedReaderHashMap.get(n);}/*** 操作结束后关闭所有读取流*/public static void closeBufferedReader(){bufferedReaderHashMap.forEach((key,value)->{try {value.close();} catch (IOException e) {log.error("第"+key+"个桶绑定的写入流关闭异常");}});}
}
大文件分隔、批量执行桶中文件操作工具类
/*** @author cliang.griffin* @description 大文件拆分工具* @date 2021/12/17*/
@Slf4j
public class BigFileSplitUtil {/*** 大文件拆分方法* @param filename 文件名* @param n 需要拆分到多少个桶中* @param bucketName 桶名* @param bucketFilename 每个桶中生成的文件叫什么* @param index 按照那个字段做hash*/public static void splitBigTxt(String filename,String bucketName,String bucketFilename,int n,int index){try(BufferedReader bufferedReader = new BufferedReader(new FileReader(filename))) {String zzqData;int i = 0;while (!StringUtils.isEmpty(zzqData = bufferedReader.readLine())){final String[] split = zzqData.split("~\\$");//放入哪个桶中BufferedFactory.setFilePath(bucketName);final BufferedWriter bufferedWriter = BufferedFactory.getBufferedWriter((n - 1) & (split[index].hashCode()),bucketFilename);bufferedWriter.write(zzqData+"\n");System.out.println("第"+ i++ +"条数据分桶成功");}}catch (IOException e){log.error("分桶失败",e);}finally {BufferedFactory.closeBufferedWriter();}}/*** 遍历桶中文件并进行相关操作。* @param bucketName 桶名* @param bucketFilename 桶中文件名*/public static void bucketExecute(String bucketName,String bucketFilename,int n,BucketFileForExecute bucketFileForExecute){try {BufferedFactory.setFilePath(bucketName);for (int i = 0; i < n; i++) {bucketFileForExecute.execute(BufferedFactory.getBufferedReader(i, bucketFilename));}} finally {BufferedFactory.closeBufferedReader();}}}
批量执行桶中代码的函数式接口(不喜欢使用函数式接口的也可以不封装这个方法)
/*** @author cliang.griffin* @description 桶中文件要如何操作函数式接口* @date 2021/12/17*/
public interface BucketFileForExecute {/*** 桶中文件要如何操作函数式接口* @param bufferedReader 桶中文件写出流*/void execute(BufferedReader bufferedReader);
}

文件太大导致jvm内存溢出,针对业务实现简易的大文件(txt)拆分执行功能相关推荐

  1. 分享一次解决线上java应用导致JVM内存溢出(OOM)的问题

    某个线上的应用运行几天后,总是出现卡死甚至出现OOM的情况. 注:文中图片可能与描述不符,仅作为演示! 通过Linux的top命令查看cpu占比 首先通过top命令查看,发现某个java程序占用了较高 ...

  2. 解决springboot项目部署时视上传视频太大导致的内存溢出问题

    在项目部署时输入命令java -Xms512m -Xmx1024m -jar 项目名.jar

  3. JVM内存溢出时快照转存HeapDump到文件

    # Heap Dump 获取方式 使用 JVM 参数获取 dump 文件 进入Tomcat的'bin'目录,在'catalina.sh'文件里添加如下内容 >-XX:+HeapDumpOnOut ...

  4. java 大数据处理之内存溢出解决办法

    因项目中需要查询大量数据,所以导致jvm内存溢出,发现这篇博文不错,转发来共同学习 原文地址:https://www.cnblogs.com/a757956132/p/4644910.html 一.内 ...

  5. 生产环境 JVM 内存溢出案例分析

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/prestigeding ...

  6. 生产环境JVM内存溢出案例分析

    如果我们所在公司的业务量比较大,在生产环境经常会出现JVM内存溢出的现象,那我们该如何快速响应,快速定位,快速恢复问题呢? 本文将通过一个线上环境JVM内存溢出的案例向大家介绍一下处理思路与分析方法. ...

  7. 生产环境JVM内存溢出案例分析!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Nginx 为什么快到根本停不下来? 个人原创100W+访问量博客:点击前往,查看更多 来源:blog.csdn ...

  8. 【深入Java虚拟机JVM 04】JVM内存溢出OutOfMemoryError异常实例

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMe ...

  9. java 大数据处理之内存溢出解决办法(一)

    http://www.cnblogs.com/a757956132/p/4644910.html http://my.oschina.net/songhongxu/blog/209951 一.内存溢出 ...

最新文章

  1. MIB in SNMP
  2. ipad无法与itunes同步,提示因为这台电脑不再被授权使用在此ipad上购买的项目解决方案...
  3. 快手上市!员工暴富!人均1300万港元!
  4. LINQ的Union方法
  5. 库克工资是普通员工201倍,纳德拉年薪三个亿,大公司贫富差距榜出炉
  6. python字符串的美化_Python构造自定义方法来美化字典结构输出
  7. 基于SPI协议的Flash全擦除
  8. Linux vi 编辑器常见命令的使用
  9. 自动化运维-Ansible (第三部:Playbook 介绍)
  10. 墨菲定律与 IndexOutOfBoundsException(数组越界异常)
  11. HDOJ(HDU) 1785 You Are All Excellent(角度运算)
  12. POJ 1014 Dividing【多重背包+二进制优化】
  13. 小明历险记:规则引擎Drools教程详解
  14. Move: 一门面向资产的编程语言
  15. python修改系统时间_python修改操作系统时间的方法
  16. 关于七牛云CDN服务器存储的图片在部分网络下无法访问的问题
  17. SAP有用的TCODE清单
  18. JS继承和继承基础总结
  19. vbs脚本实现Ping功能
  20. 理解LSTMs (Long Short Term Memory Networks)

热门文章

  1. java 使用POI简单excel表格导出,通过浏览器直接下载
  2. Linux查杀stopped进程
  3. zipkinbrave
  4. SLAB缓存管理之创建使用
  5. 7-60 高速公路超速处罚 (15 分)
  6. Ubuntu14.04下安装QQ 国际版
  7. (脑肿瘤分割笔记:五十七)基于3D注意力UNet的脑肿瘤分割与生存预测
  8. FLASH芯片(W25Q128)
  9. 中业科技机器人_中业科技上半年营收3298.72万元?净利润194.27万元
  10. Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials