需求背景
接到需求是要对商家提供的数据文件解析为对应我们业务需要的对象,由于商家给的文件是zip文件,大小在10-100M直接,如果用单个线程处理解析势必会影响处理速度,
以下是我们解析时候写的代码。大概思路是这个样子:

思路1:

  1. 解析zip文件:
    – 由于zip文件中有对应自己要解析的流文件,解读流中指定的文件,获得对应的文件流。
    – 单个线程测试读取流数据感觉还可以接受,处理时间大概在2000ms之内。
    – 重点考虑多个线程去消费,需要将处理后的数据放在某一个队列中,让消费者去解析
    2.生成对象列表:
    – 处理解析出来的数据,生成我们需要的对象数据列表。
    – 主要是消费文件解析出来的行数据。将数据处理为对应的对象。
    – 将数据放入对应的列表中,这样在获取列表的数据进行后续的操作。
    3.将对象持久化:
    – 顺序读取列表中的数据,将解析出来的对象做持久化操作。对列表中的数据进行入库。
    – 按照上边的分析,我们可能需要对几个地方可以进行多线程优化。按照这个思路就开干。
/**1. @author Janle2. @date 2018/1/18 10:42*/
public class ZipFileParser<T> {private final ConcurrentLinkedQueue<String> readLines;private ExecutorService executorService;private int threadSize;private final String zipFile;private final String readFileName;private CountDownLatch countDownLatch;private Class<T> t;private List<T> target;private int counter;private AtomicBoolean canRelease = new AtomicBoolean(false);public ZipFileParser(String zipFile, String readFileName, Class<T> t) {//计算线程的数量this(zipFile, Runtime.getRuntime().availableProcessors() * 2, readFileName, t);}public ZipFileParser(String zipFile, int threadSize, String readFileName, Class<T> t) {//计算线程的数量this.threadSize = threadSize > 0 ? threadSize : Runtime.getRuntime().availableProcessors() * 2;executorService = Executors.newFixedThreadPool(this.threadSize);this.readLines = Queues.newConcurrentLinkedQueue();this.zipFile = zipFile;this.readFileName = readFileName;this.t = t;}/*** 解析流文件*/public void start() {new Thread(() -> {ZipFile zip = null;try {//TODO 校验拦截是否是zip文件zip = new ZipFile(zipFile);//获得zip文件中的entry值Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();ZipEntry ze;int line = 0;// 枚举zip文件内的文件/while (entries.hasMoreElements()) {ze = entries.nextElement();// 读取目标对象if (ze.getName().equals(readFileName)) {Scanner scanner = new Scanner(zip.getInputStream(ze));while (scanner.hasNextLine()) {//写入读取的行readLines.add(scanner.nextLine());line++;}scanner.close();}//计算最大的行数counter = line;}zip.close();} catch (IOException e) {e.printStackTrace();} finally {canRelease.set(true);try {zip.close();} catch (IOException e) {e.printStackTrace();}}}).start();}/*** 使用多个线程读取线程中的文件** @return*/private void consumer() {//计算线程处理数据的大小,分发到各个线程处理countDownLatch = new CountDownLatch(this.threadSize);//汇总的目标listthis.target = Lists.newArrayList();Constructor<T> c = null;try {c = t.getConstructor(String.class);} catch (NoSuchMethodException e) {e.printStackTrace();}final Constructor constructor = c;//放入多个线程中去处理消费for (int i = 0; i < this.threadSize; i++) {executorService.submit(() -> {List<T> list = Lists.newArrayList();//如果执行没有完成或没有消费完队列数据while (true) {while (canRelease.get() && readLines.isEmpty()) {//将解析后的数据放入目标队列,这里要注意使用同步操作mergeList(list);countDownLatch.countDown();return;}String line = readLines.poll();if (StringUtils.isEmpty(line)) {continue;}T obj = null;try {obj = (T) constructor.newInstance(line);list.add(obj);} catch (Exception e) {e.printStackTrace();}}});}}/*** 同步合并列表** @param list*/private synchronized void mergeList(List<T> list) {this.target.addAll(list);}/*** 返回对应的数据处理类** @return*/public List<T> getParsedList() {try {consumer();countDownLatch.await();executorService.shutdown();//TODO 接入数据处理和Db操作,这里返回处理的回调结果就好,不需要进行返回列表return this.target;} catch (Exception e) {e.printStackTrace();}return Lists.newArrayList();}
}

以上有3个地方需要注意:
3. 读取zip中的数据时候没有想到好的解析方式解读zip中的文件内容。
4. 在合并的目标列表主要不要使用同步列表。最好是将列表分到各个多线程的处理块中。
4. mergeList(list);作用就像是将缓存中的数据合并为一个缓存列表。

思路2:
1.第二版解析处理代码
解析zip文件:
–由于zip文件中有对应自己要解析的流文件,解读流中指定的文件,获得对应的文件流。
–单个线程测试读取流数据感觉还可以接受,处理时间大概在2000ms之内。
–重点考虑多个线程去消费,需要将处理后的数据放在某一个队列中,让消费者去解析
2.解析处理入库:
–将队列中的数据接入到对应的多个线程消费处理直接入库。不会在列表对象中存放。

这个图片不好整理,直接在这里放URL了
http://note.youdao.com/noteshare?id=cbeee975a075fb40e212cd41f698f319

多线程 -之对Zip压缩文件的解析相关推荐

  1. python 实现文件的批量压缩为.zip格式+.zip格式文件的解析

    python 实现文件的批量压缩为.zip格式+.zip格式文件的解析 python 实现文件的批量压缩为.zip格式 Python解析.zip文件的常见函数 python 实现文件的批量压缩为.zi ...

  2. ssis zip压缩文件_SSIS平面文件与原始文件

    ssis zip压缩文件 In this article, we will give an overview of using Flat Files and Raw Files in SSIS, th ...

  3. java util zip.zipexc,JAVA解压zip压缩文件的实例

    今天在弄一个东西,需要在PL/SQL中解压zip的压缩包,刚开始的时候是想着直接在PLSQL中调用java,在java里面调用unzip的shell命令来解析压缩文件,但是比较悲剧,一直老是失败,在尝 ...

  4. Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件、zip压缩文件

    Python将Pandas中Dataframe数据保存为gzip/zip文件:gzip压缩文件.zip压缩文件 目录 Python将Pandas中Dataframe数据保存为gzip/zip文件:gz ...

  5. PHP 4.4.7 中用 PEAR 类库操作 ZIP 压缩文件

    运行 pear install Archive_Tar 命令可以安装 PEAR 的 Tar 的操作类,但是 Tar 文件是个打包归档文件,并没有压缩而使文件占用的空间减少.而运行 pear insta ...

  6. php创建压缩文件 保存路径,通过php生成zip压缩文件,支持文件和压缩包路径查找...

    /* * new creatZip($_dir,$_zipName); *@ _dir是被压缩的文件夹名称,可使用路径,例 'a'或者'a/test.txt'或者'test.txt' *@ _zipN ...

  7. 同事说rar压缩有风险,让我用zip压缩文件

    在现在最常见的压缩文件有zip.rar.7z三种,它们都有各自的优点和缺点. 我们用一句话来概括一下:7z压缩率最高,RAR安全性高,ZIP使用范围广. 文件压缩打包是最为常见的一种分享方式了,而众多 ...

  8. java实现zip压缩文件(同一文件夹下的多个文件夹打成一个zip包)

    这2个工具类都推荐使用统一个场景的不通过写法 推荐第一种 package com.gblfy.test;import java.io.BufferedInputStream; import java. ...

  9. zip4j -- Java处理zip压缩文件

    ZIP4J,作为解决了我的问题的终极解决方案,本来一开始在搜索引擎上就看到了它的踪迹,但因天朝的网络环境问题,zip4j的官网一直无法访问,最终使我多走了好多冤枉路,期间试过JDK的zip包,试过Ap ...

最新文章

  1. 中批注转成pdf看不到_超实用的PDF在线转换器,你绝对用的到~
  2. 实时计算Flink 产品定价——续费和变配
  3. 你想建设一个能承受500万PV/每天的网站吗?如果计算呢?
  4. RMAN-06023: no backup or copy of datafile 6 found to restore
  5. TabBars代码解读之——Visual Studio的自动化接口
  6. C语言if( x)的意思,c语言中if(x)是什么意思?_后端开发
  7. 900万!!!!!!!!这也太强了吧!!!我的老天!!!!!!!!!!
  8. 设置电脑双显示屏或者说扩展一个显示器
  9. 闲鱼易用高可扩的文章发布工具建设
  10. 论文笔记 NAACL findings 2022|Zero-Shot Event Detection Based on Ordered Contrastive Learning and Prompt-
  11. ntlm-auth java_JAVAMAIL:AUTH NTLM失败
  12. 靶机测试 Me and My Girlfriend1笔记
  13. android系统应用之Settings
  14. C8825D解锁步骤
  15. 网络问题解决—电脑能上网(QQ微信和浏览器一级网页)但浏览器打不开二级网页
  16. 商标的商品和服务分类有45个
  17. c webservice html,在WEBSERVICE中用于描述WEB服务的语言是()A、WSDLB、UMLC、 - 信管网...
  18. 安装Flash9时,提示“Error 1904.Module的解决办法
  19. Java8 将List转换为用逗号隔开的字符串
  20. 使用Spring Cloud配置服务器控制配置

热门文章

  1. 单片机生日快乐歌c语言,如何用单片机 唱生日快乐歌
  2. java数组设计的原理_动态图-Java常用数据结构及其设计原理
  3. ACL国际计算机语言协会2019,我校夏睿团队获得自然语言处理国际顶级会议ACL2019杰出论文奖...
  4. MDK5/KeiluVsion5安装报错“Download of PDSC index file failed”
  5. 2022-2028年全球与中国皮卡行业市场前瞻与投资战略规划分析
  6. 魔金(3)——正三角、四方锁、八卦锁、魔戒
  7. 紫龙劝星矢考研的一封信
  8. TGame游戏新篇:1.3 软件设计
  9. 中南大学复试上机:饭卡
  10. 【毕业设计】深度学习乳腺癌医学图像分类算法研究与实现 - python 卷积神经网络