使用场景:
        当你有一个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. 长轮询和Comet

    长轮询方式是由前端定时发起AJAX请求,若请求到数据则把数据显示出来. comet方式是由客户端与服务器端发起一个长连接,然后客户端通过监听事件的方式,来对服务器端返回的数据作出响应和处理. 实时性要 ...

  2. LR之Java虚拟用户

    1.认识Java虚拟用户 2.Java虚拟用户的适用范围

  3. linux_2015_0827_linux中一些常用词的发音and…

    linux相关 Unix: [ ju:niks ] 发音 (yew-nicks) 尤里克斯 GNU [ gəˈnju: ] 发音 (guh-noo) 葛扭 Linux: [ 'li:nэks ] 里那 ...

  4. Intent传输数据的补充

    发现用intent的putExtra()或者putExtras()传输的都是基本数据类型. 如果要传输自定义数据类型,就要用到其他方法,老罗介绍的大概有3种: 1.  静态变量 2.  全局变量 3. ...

  5. Winform後台如何動態修改App.config文件里的內容

    以下方法修改的,自己添加的app.config裡面不會顯示出修改的東西. 方法一:通過使用System.Xml.XmlDocument對象的方法進行bin\debug\~.vshost.exe.Con ...

  6. c语言字符串大小写字母转换

    输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变. 输入格式: 输入在一行中给出一个长度不超过40的.以#结束的非空字符串. 输出格式: 在一 ...

  7. 图解WPF程序打包全过程

    首先打开已经完成的工程,如图: 下面开始制作安装程序包. 第一步:[文件]——[新建]——[项目]——安装项目. 名称——可以自己根据要求修改. 位置——是指你要制作的安装文件存放在什么目录内,可以根 ...

  8. Netbeans Platform 工程,免安装JDK

    使用Netbeans 6.8 创建了一个Netbeans Platform 工程,以Zip形式发布后, 按照以下操作,可 以在客户端免安装JDK: 1. 从已安装JDK的计算机中,提取JDK:eg. ...

  9. 信号量的操作——semop函数

    信号量的值与相应资源的使用情况有关,当它的值大于 0 时,表示当前可用的资源数的数量:当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数.信号量的值仅能由 PV 操作来改变.        在 ...

  10. HDU 1079 Calendar Game(简单博弈)

    Calendar Game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...