使用场景:
        当你有一个Excel文件,需要把其中的数据高速录入到数据库中,文件中包含10万条以上数据。
设计方案:
       我们将整个过程分成三个阶段,A(装载Excel文件)、B(读取Excel文件中的数据)、C(数据入库)。一种方法是常规的,ABC三个阶段顺序执行,直到全部数据入库。入库采用数据库的批量插入操作,以便提高效率。这个方案我使用装载Excel文件较快的fastexcel组件来完成A阶段,实验结果是,我将Excel中的两个Sheet全部13万条数据(每条3列)入库,需花费11秒左右。其中三个阶段耗费时间如下图所示:
          从图中我们看到A阶段几乎不耗费多少时间,如果使用POI组件的话,将耗费最主要的时间,因为其比较复杂,初始化工作较多,我们这里只读Excel,所以采用了fastExcel组件。而B和C阶段耗费时间最多,所以其性能瓶颈就出在这两个阶段。很显然由于先前采用的是单线程执行,所以C阶段必须等待B阶段完成后才能执行,从而影响的性能。如果我们能提早执行C阶段的话,不就可以缩短整个入库时间了吗?非常好的注意,于是采用多线程方案,设计如图所示:
 
         由于A阶段耗费时间极少,且只有一个Excel文件,所以这个过程仍然保持串联方式进行,我们需要并联的部分是B和C阶段,因为这两个阶段才是系统的瓶颈坐在,需要分流负载。比如说:我们将Sheet0工作表交给一个线程,该线程负责该工作表的读取和入库操作。这样,我们系统整个入库阶段的工作就可以提前开始,而不用等到单线程模式下B阶段全部完成才开始了。其余的Sheet类似。注意多线程并不能怎么多的提高数据入库的效率,在这里,只是让数据库提前开始了入库工作,从而也就缩短了整个阶段的时间。
 
         结果实验结果,同样的数据量,入库时间变为7-8秒,比原来有所提高,从而也就提高的效率。
         撰写这篇文章主要是给我们发散一下思维,不要老用以往的定式思维想问题。串联模式容易造成系统性能瓶颈情况下,此时可以考虑系统的并联模式。

由“大数据量Excel入库高效方式”瞥见“并联系统”之优势的更多相关文章

  1. POI读写大数据量excel,解决超过几万行而导致内存溢出的问题

    1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384 ...

  2. [转]POI大数据量Excel解决方案

    全文转载自:jinshuaiwang的博客 目前处理Excel的开源javaAPI主要有两种,一是Jxl(Java Excel API),Jxl只支持Excel2003以下的版本.另外一种是Apach ...

  3. POI读写大数据量EXCEL

    另一篇文章http://www.cnblogs.com/tootwo2/p/8120053.html里面有xml的一些解释. 大数据量的excel一般都是.xlsx格式的,网上使用POI读写的例子比较 ...

  4. POI3.8解决导出大数据量excel文件时内存溢出的问题

    POI3.8的SXSSF包是XSSF的一个扩展版本,支持流处理,在生成大数据量的电子表格且堆空间有限时使用.SXSSF通过限制内存中可访问的记录行数来实现其低内存利用,当达到限定值时,新一行数据的加入 ...

  5. 大数据量情况下高效比较两个list

    比如,对两个list<object>进行去重,合并操作时,一般的写法为两个for循环删掉一个list中重复的,然后再合并. 如果数据量在千条级别,这个速度还是比较快的.但如果数据量超过20 ...

  6. C#读取大数据量Excel

    var worksheet = workbook.Worksheets["工作表1"]; var maxN = worksheet.Range["A1"].En ...

  7. python3 修改大数据量excel内容

    最好使用python3 64位 对excel的修改操作: from openpyxl import load_workbook import time #打开一个excel表格.xlsx wb = l ...

  8. POI 读写大数据量 EXCEL

    参考:https://www.cnblogs.com/tootwo2/p/6683143.html

  9. 使用OPENROWSET、Microsoft.ACE.OLEDB实现大数据量的高效导入

    首先说明使用的环境是:java和Sqlserver. 最近公司需要进行大数据量的导入操作.原来使用的是Apache POI,虽然可以实现功能,但是因为逻辑处理中需要进行许多校验,处理速度太慢,使用多线 ...

随机推荐

  1. the server responded with a status of 404 (Not Found)

    1.出现这种问题,第一时间检查文件路径是否正确,相对路径或者绝对路径是否正确 2.某些后缀的文件是否能够找到,我现在碰到的就是.md文件找不到,需要配置web.config <system.we ...

  2. android启动页优化实践

    最近观看友盟统计发现App启动页跳出率很高,观看启动页的平均启动时间为2.8s,如下图: 所以一个很现实的问题就出来了,优化启动页面... (一)做了什么? 我们的启动页面主要用于展示启动页面,加载网 ...

  3. 修复duilib CEditUI控件和CWebBrowserUI控件中按Tab键无法切换焦点的bug

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41556615 在duilib中,按tab键会让焦点在Button一类的控 ...

  4. Chapter10:泛型算法

    泛型算法的基础是迭代器. 迭代器令算法不依赖于容器,但是算法依赖于元素类型的操作.也即:算法永远不会执行容器的操作. 那么,如果想向容器中添加元素或者执行其他的一些操作呢?标准库提供了插入迭代器来完成 ...

  5. UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)

    UML的类图关系分为: 关联.聚合/组合.依赖.泛化(继承).而其中关联又分为双向关联.单向关联.自身关联:下面就让我们一起来看看这些关系究竟是什么,以及它们的区别在哪里. 1.关联 双向关联:C1- ...

  6. kali 重置 mysql 密码

    You can recover MySQL database server password with following five easy steps. Step # 1: Stop the My ...

  7. Yii 1.1 URL两个笔记 同时支持PATH于GET路由和隐藏index.php

    同时支持PATH于GET格式路由(修改框架文件 简直坑) framework/web/CUrlManager.php parseUrl方法 第一行判断修改成 if($this->getUrlFo ...

  8. 如何通过Android Studio发布library到jCenter和Maven Central

    http://www.jianshu.com/p/3c63ae866e52# 在Android Studio里,如果你想引入任何library到自己的项目中,只需要很简单的在module的build. ...

  9. EntityFramwork6连接MySql错误

    EntityFramwork6连接MySql错误 使用EF6连接MySql产生Exception: ProHub.ssdl(2,2) : 错误 0152: MySql.Data.MySqlClient ...

  10. ArcObjects10.0引用控件报错

    错误如下:ArcGIS version not specified. You must call RuntimeManager.Bind before creating any ArcGIS comp ...