Java大文本并行计算实现过程解析

 更新时间:2020年06月05日 11:06:52   作者:麋鹿✈  
这篇文章主要介绍了Java大文本并行计算如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

简单提高文本读取效率,使用BufferedReader是个不错的选择。速度最快的方法是MappedByteBuffer,但是,相比BufferedReader而言,效果不是非常明显。也就是说,后者虽然快,但也快的有限(不要抱有性能提升几倍的幻想)。

对于大文本的读取,性能瓶颈主要在IO,read占时间多是正常的,硬盘本身就不快,读入内存后还要转成对象,都比较耗时间。

想要提速应当用并行的办法,用多线程同时读取和处理数据,但Java写多线程程序很麻烦,并行分段读同一个文件时还要考虑调整边界,也比较麻烦。

比如要这么个场景:分组汇总每个客户的销售额,部分源数据如下:

O_ORDERKEY    O_CUSTKEY    O_ORDERDATE    O_TOTALPRICE
10262  RATTC  1996-07-22    14487.0
10263  ERNSH  1996-07-23    43818.0
10264  FOLKO  2007-07-24    1101.0
10265  BLONP  1996-07-25    5528.0
10266  WARTH  1996-07-26    7719.0
10267  FRANK  1996-07-29    20858.0
10268  GROSR  1996-07-30    19887.0
10269  WHITC  1996-07-31    456.0
10270  WARTH  1996-08-01    13654.0
...

期望的结果:

Java部分多线程代码大概要写成这样:

...
final int DOWN_THREAD_NUM = 8;
CountDownLatch doneSignal = new CountDownLatch(DOWN_THREAD_NUM);
RandomAccessFile[] outArr = new RandomAccessFile[DOWN_THREAD_NUM];
try{
	long length = new File(OUT_FILE_NAME).length();
	long numPerThred = length / DOWN_THREAD_NUM;
	long left = length % DOWN_THREAD_NUM;
	for (int i = 0; i < DOWN_THREAD_NUM; i++) {
		outArr[i] = new RandomAccessFile(OUT_FILE_NAME, "rw");
		...                
		    if (i == DOWN_THREAD_NUM - 1) {
			new ReadThread(i * numPerThred, (i + 1) * numPerThred + left, outArr[i],keywords,doneSignal).start();
			...
		} else {
			new ReadThread(i * numPerThred, (i + 1) * numPerThred,outArr[i],keywords,doneSignal).start();
			...
		}
	}
}
...

如果有集算器就简单多了,它对Java的多线程进行了封装,提供了对大文件分段并行的功能,写起来容易多了,对人员要求也低。比如上面问题,2行就搞定了(集算器内置了并行选项@m,不设置并行数,默认按核数做为并行数):

=file("/workspace/orders.txt").cursor@mt()

=A1.groups(O_CUSTKEY;sum(O_TOTALPRICE):AMOUNT)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • spring boot整合CAS Client实现单点登陆验证的示例

    spring boot整合CAS Client实现单点登陆验证的示例

    本篇文章主要介绍了spring boot整合CAS Client实现单点登陆验证的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 详细分析JAVA加解密算法

    详细分析JAVA加解密算法

    这篇文章主要介绍了JAVA加解密算法的的相关资料,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • java 获取mac地址的两种方法(推荐)

    java 获取mac地址的两种方法(推荐)

    下面小编就为大家带来一篇java 获取mac地址的两种方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • mybatis查询语句揭秘之封装数据

    mybatis查询语句揭秘之封装数据

    这篇文章主要给大家介绍了关于mybatis查询语句揭秘之封装数据的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Mybatis insert方法主键回填和自定义操作

    Mybatis insert方法主键回填和自定义操作

    这篇文章主要介绍了Mybatis insert方法主键回填和自定义操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Spring和SpringMVC扫描注解类冲突的解决方案

    Spring和SpringMVC扫描注解类冲突的解决方案

    这篇文章主要介绍了Spring和SpringMVC扫描注解类冲突的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Spring事务管理中的异常回滚是什么

    Spring事务管理中的异常回滚是什么

    Spring中的代码出现异常时会回滚这是大家都希望的情况,这时候可以用@Transactional这个注解放在你的方法上来进行回滚,这时候有个问题就是事务回滚是不希望你在Controller进行处理,而是在Service层来进行处理
    2023-02-02
  • Spring @Cacheable注解中key的使用详解

    Spring @Cacheable注解中key的使用详解

    这篇文章主要介绍了Spring @Cacheable注解中key的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中的线程ThreadLocal详细解析

    Java中的线程ThreadLocal详细解析

    这篇文章主要介绍了Java中的线程ThreadLocal详细解析,ThreadLocal是线程本地变量,存储在ThreadLocal里面的数据都是线程安全的,一般ThreadLocal适用的场景多是各个线程间没有变量共享需要的同步问题场景,需要的朋友可以参考下
    2023-10-10
  • Java嵌入式开发的优势及有点总结

    Java嵌入式开发的优势及有点总结

    在本篇内容里小编给大家整理了关于Java嵌入式开发的优势及相关知识点内容,有兴趣的朋友们学习下。
    2022-11-11

最新评论