- 浏览: 980939 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
JVM学习笔记:http://blog.csdn.net/cutesource/article/details/5904501
堆内存设置原理:http://blog.csdn.net/sivyer123/article/details/17139443/
JVM 之 GC日志分析 :http://blog.csdn.net/lan861698789/article/details/51985188
JVM client模式和Server模式的区别:http://developer.51cto.com/art/201009/228035.htm
垃圾收集器:http://yueyemaitian.iteye.com/blog/1185301
VisualVM分析器:http://www.cnblogs.com/linghu-java/p/5689227.html
MemoryAnalyzer使用:http://wensong.iteye.com/blog/1986449
MAT中Retained和Shallow区别:http://bjyzxxds.iteye.com/blog/1532937
应用场景:先需要将Mdb中的表中数据,全量迁移到Sdb中,一种方法用工具Kettle,第二种编写脚本,第三种程序迁移,第一与第二种迁移对大表没有问题,第三种,由于百万级数据表,全量从Mdb取出,再全量插入的Sdb,对内存的要求较高,比较有效的方法是分页查询,再插入;今天我们不讲的分页查询插入,来看全量从Mdb取出,再分批量插入的Sdb,关于分页分批插入(为应对内存问题,可以将查询结果存到文件,再从文件中读取插入),后续再讲。
主要代码:
下面的测试表记录数为28万
Tomcat:JavaOPT 默认
-client
-Xmx256M
JVM虚拟机默认启动时,client模式,垃圾模式为Serial New + Serial Old
当counts%10000==0,批量为10000,抛出OOM:java heap space
当Data d = new Data();放在循环外定义:Data d = null;抛出OOM:java heap space
当批量为5000时:
JConsole 堆信息:
2016-09-29 16:40:42
已使用: 107,876 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(326 项收集)所用的时间为 2.518 秒
MarkSweepCompact(171 项收集)所用的时间为 1 minute
所用时间s:220.66
VisualVM:
Viusal GC:
去除log.info("============Records:"+counts);
JConsole 堆信息:
时间: 2016-09-29 16:25:44
已使用: 244,748 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(332 项收集)所用的时间为 2.456 秒
MarkSweepCompact(114 项收集)所用的时间为 39.902 秒
所用时间s:163.09
这说明,不要打,不必要的log
VisualVM:
Viusal GC:
当批量为2000时:
JConsole 堆信息:
2000
时间: 2016-09-29 16:50:28
已使用: 252,652 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(321 项收集)所用的时间为 2.369 秒
MarkSweepCompact(106 项收集)所用的时间为 36.438 秒
所用时间s:145.524
VisualVM:
Viusal GC:
对比5000可以看出,堆内存的趋势图,更平缓,Copy及MarkSweepCompact收集次数减少,故所用时间降低。
当批量为1000时:
JConsole 堆信息:
时间: 2016-09-29 17:03:10
已使用: 249,215 Kb
分配: 253,440 Kb
最大值:253,440 Kb
GC 时间:
Copy(330 项收集)所用的时间为 2.299 秒
MarkSweepCompact(100 项收集)所用的时间为 34.530 秒
所用时间s:159.459
从所用时间和Copy及来看,比2000批次还有,MarkSweepCompact收集次数减少了6次
从5000,2000,1000来看说明,批次处理量对处理的速度有影响,应选择合适的批次数量。
下面调整一下
JavaOPT
-server
-XX:+PrintGCDetails
-Xloggc:E:\gc.log
Server模式下,垃圾回收器默认为PS Scavenge+ PS-Old
我的机器内存是8G,默认Server模式下,Xmx1024M ,同样的处理逻辑:
当批量为2000时:
JConsole 堆信息:
时间: 2016-09-29 17:12:41
已使用: 337,969 Kb
分配: 574,784 Kb
最大值: 932,096 Kb
GC 时间:
PS MarkSweep(6 项收集)所用的时间为 1.475 秒
PS Scavenge(74 项收集)所用的时间为 1.090 秒
全量更新所用时间s:114.25
当批量为5000时:
时间: 2016-09-29 17:19:26
已使用: 365,969 Kb
分配: 547,968 Kb
最大值: 932,096 Kb
GC 时间:
PS MarkSweep(6 项收集)所用的时间为 1.400 秒
PS Scavenge(70 项收集)所用的时间为 1.212 秒
所用时间s:107.12
从上可以看出新生代的收集次数减少,所用时间减少,这说明当堆内存增大时,可以相应的调整批量处理数,以提高处理效率。
我们来看看在-server,模式下能处理的最大记录数:
java OPTS:
-server
-Xms512M
-Xmx1024M
-XX:NewSize=384M
-XX:ParallelGCThreads=4
-XX:+PrintGCDetails
-Xloggc:E:\gc.log
时间: 2016-09-29 18:16:19
已使用: 1,004,657 Kb
分配: 1,028,288 Kb
最大值: 1,028,288 Kb
GC 时间:
PS MarkSweep(424 项收集)所用的时间为 10 minutes
PS Scavenge(121 项收集)所用的时间为 3.631 秒
在上述配置下,能够处理的最大记录数为1040000
总结:
从上的分析来看,批量处理的数量,应该根据堆内存的变化而调整,已达到立项的处理效率;
在1G的堆内存,处理百万级以下的数据量,还是可以滴。
分页分批次处理:
java opts:
-server
-Xms1024M
-Xmx1536M
-XX:NewSize=512M
-XX:ParallelGCThreads=4
主要逻辑:
在InsertRecordByPages函数中,不用的局部变量要null化
结果:可以处理140万的数据
==============第15页start==========
2016-09-30 16:16:10 -885050 ==============已更新记录数:1409864
2016-09-30 16:16:10 -885050 ==============第15页end==========
再大,只能用工具迁移了。
堆内存设置原理:http://blog.csdn.net/sivyer123/article/details/17139443/
JVM 之 GC日志分析 :http://blog.csdn.net/lan861698789/article/details/51985188
JVM client模式和Server模式的区别:http://developer.51cto.com/art/201009/228035.htm
垃圾收集器:http://yueyemaitian.iteye.com/blog/1185301
VisualVM分析器:http://www.cnblogs.com/linghu-java/p/5689227.html
MemoryAnalyzer使用:http://wensong.iteye.com/blog/1986449
MAT中Retained和Shallow区别:http://bjyzxxds.iteye.com/blog/1532937
应用场景:先需要将Mdb中的表中数据,全量迁移到Sdb中,一种方法用工具Kettle,第二种编写脚本,第三种程序迁移,第一与第二种迁移对大表没有问题,第三种,由于百万级数据表,全量从Mdb取出,再全量插入的Sdb,对内存的要求较高,比较有效的方法是分页查询,再插入;今天我们不讲的分页查询插入,来看全量从Mdb取出,再分批量插入的Sdb,关于分页分批插入(为应对内存问题,可以将查询结果存到文件,再从文件中读取插入),后续再讲。
主要代码:
int counts =0;//记录数 //Data d = null; while (rs.next()) { Data d = new Data(); d = getData(rs); insertList.add(d); pd = null;//待gc回收 if(counts%5000==0){ batchSave(insert, insertList); insertList.clear(); log.info("============RecordsSave:"+counts); } if(rs.isLast()){ batchSave(insert, insertList); insertList.clear(); } log.info("============Records:"+counts); counts++; }
下面的测试表记录数为28万
Tomcat:JavaOPT 默认
-client
-Xmx256M
JVM虚拟机默认启动时,client模式,垃圾模式为Serial New + Serial Old
当counts%10000==0,批量为10000,抛出OOM:java heap space
当Data d = new Data();放在循环外定义:Data d = null;抛出OOM:java heap space
当批量为5000时:
JConsole 堆信息:
2016-09-29 16:40:42
已使用: 107,876 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(326 项收集)所用的时间为 2.518 秒
MarkSweepCompact(171 项收集)所用的时间为 1 minute
所用时间s:220.66
VisualVM:
Viusal GC:
去除log.info("============Records:"+counts);
JConsole 堆信息:
时间: 2016-09-29 16:25:44
已使用: 244,748 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(332 项收集)所用的时间为 2.456 秒
MarkSweepCompact(114 项收集)所用的时间为 39.902 秒
所用时间s:163.09
这说明,不要打,不必要的log
VisualVM:
Viusal GC:
当批量为2000时:
JConsole 堆信息:
2000
时间: 2016-09-29 16:50:28
已使用: 252,652 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(321 项收集)所用的时间为 2.369 秒
MarkSweepCompact(106 项收集)所用的时间为 36.438 秒
所用时间s:145.524
VisualVM:
Viusal GC:
对比5000可以看出,堆内存的趋势图,更平缓,Copy及MarkSweepCompact收集次数减少,故所用时间降低。
当批量为1000时:
JConsole 堆信息:
时间: 2016-09-29 17:03:10
已使用: 249,215 Kb
分配: 253,440 Kb
最大值:253,440 Kb
GC 时间:
Copy(330 项收集)所用的时间为 2.299 秒
MarkSweepCompact(100 项收集)所用的时间为 34.530 秒
所用时间s:159.459
从所用时间和Copy及来看,比2000批次还有,MarkSweepCompact收集次数减少了6次
从5000,2000,1000来看说明,批次处理量对处理的速度有影响,应选择合适的批次数量。
下面调整一下
JavaOPT
-server
-XX:+PrintGCDetails
-Xloggc:E:\gc.log
Server模式下,垃圾回收器默认为PS Scavenge+ PS-Old
我的机器内存是8G,默认Server模式下,Xmx1024M ,同样的处理逻辑:
当批量为2000时:
JConsole 堆信息:
时间: 2016-09-29 17:12:41
已使用: 337,969 Kb
分配: 574,784 Kb
最大值: 932,096 Kb
GC 时间:
PS MarkSweep(6 项收集)所用的时间为 1.475 秒
PS Scavenge(74 项收集)所用的时间为 1.090 秒
全量更新所用时间s:114.25
当批量为5000时:
时间: 2016-09-29 17:19:26
已使用: 365,969 Kb
分配: 547,968 Kb
最大值: 932,096 Kb
GC 时间:
PS MarkSweep(6 项收集)所用的时间为 1.400 秒
PS Scavenge(70 项收集)所用的时间为 1.212 秒
所用时间s:107.12
从上可以看出新生代的收集次数减少,所用时间减少,这说明当堆内存增大时,可以相应的调整批量处理数,以提高处理效率。
我们来看看在-server,模式下能处理的最大记录数:
java OPTS:
-server
-Xms512M
-Xmx1024M
-XX:NewSize=384M
-XX:ParallelGCThreads=4
-XX:+PrintGCDetails
-Xloggc:E:\gc.log
时间: 2016-09-29 18:16:19
已使用: 1,004,657 Kb
分配: 1,028,288 Kb
最大值: 1,028,288 Kb
GC 时间:
PS MarkSweep(424 项收集)所用的时间为 10 minutes
PS Scavenge(121 项收集)所用的时间为 3.631 秒
在上述配置下,能够处理的最大记录数为1040000
总结:
从上的分析来看,批量处理的数量,应该根据堆内存的变化而调整,已达到立项的处理效率;
在1G的堆内存,处理百万级以下的数据量,还是可以滴。
分页分批次处理:
java opts:
-server
-Xms1024M
-Xmx1536M
-XX:NewSize=512M
-XX:ParallelGCThreads=4
主要逻辑:
sql = "SELECT COUNT(*) FROM " + test; ps = con.prepareStatement(sql); countResultSet = ps.executeQuery(); int sums =0; while(countResultSet.next()){ sums =countResultSet.getInt(1); } int batches = 0; if( sums > 100000){ if(sums % 100000 ==0){ batches = sums/100000; } else{ batches = sums/100000 + 1; } } int counts =0;//记录数 for(int i =1;i<=batches;i++){ logger.info("==============第"+i+"页start=========="); counts+=InsertRecordByPages((i-1)*100000+1,(i)*100000); logger.info("==============已更新记录数:"+counts); logger.info("==============第"+i+"页end=========="); }
在InsertRecordByPages函数中,不用的局部变量要null化
结果:可以处理140万的数据
==============第15页start==========
2016-09-30 16:16:10 -885050 ==============已更新记录数:1409864
2016-09-30 16:16:10 -885050 ==============第15页end==========
再大,只能用工具迁移了。
发表评论
-
Deadlock found when trying to get lock; try restarting transaction解决方式
2017-07-18 23:00 2062MySQL 事务的学习整理:http://blog.csdn. ... -
MySQL慢日志
2017-05-18 16:05 1034The Slow Query Log:https://dev. ... -
The table is full问题解决过程
2017-05-06 15:29 7600The table‘xxxx’is full 设置临时表大小 ... -
百万级数据-程序迁移后续
2017-04-13 18:09 1634百万级数据-程序迁移:http://donald-draper ... -
Msyql日期字符串转换
2017-04-01 14:13 542Date和String的互相转换:http://www.tui ... -
Mysql添加约束
2017-03-31 16:28 901MySQL中对三种约束的支持:http://leekai.me ... -
Mysql FEDERATED引擎
2016-11-29 15:51 605使用mysql federated引擎构建MySQL分布式数据 ... -
MySQL触发器
2016-11-24 19:04 716CHANGE MASTER:http://dev.mysql. ... -
Mysql主从配置
2016-11-11 18:31 5291、主从服务器分别作以下操作: 1)版本一致 2)初始 ... -
Mysql 备份工具XtraBackup增量备份
2016-08-05 18:11 722安装:http://donald-draper.iteye.c ... -
Mysql 备份工具XtraBackup全量备份
2016-08-05 16:41 564Percona安装:http://donald-draper. ... -
Mysql 备份工具XtraBackup 安装
2016-08-05 16:28 942开源热备工具XtraBackup下载:https://www. ... -
sysbench基准测试
2016-08-01 17:45 786下载sysbench:http://dev.mysql.com ... -
mysql 事务处理
2016-07-29 16:07 510创建表: CREATE TABLE `role` ( ` ... -
mysql 全文索引
2016-07-28 11:03 614mysql大表查询的时候,'String%'模糊查询可以使用B ... -
MySQL 物理文件的迁移
2016-07-26 15:39 2343参考资料:http://www.cnblogs.com/adv ... -
centos7 安装mysql
2016-07-26 11:36 746下载MYSQL-RPM包:http://downloads.m ... -
mysql 大表添加索引注意事项
2016-07-25 16:01 2641LINXU top命令: http://www.c ... -
mysql 大表分页查询测试分析优化
2016-07-25 11:30 1501索引概念: http://blog.csdn.net/xlur ... -
MySQL事务
2016-06-01 10:49 614事务基础知识:http://my.oschina.net/je ...
相关推荐
3. 迁移执行:根据虚拟机的配置文件,执行迁移过程,并将物理机的操作系统、应用程序和数据迁移到虚拟机中。 四、P2V-Linux 迁移的优点 P2V-Linux 迁移具有以下几个优点: 1. 提高服务器的可用性:P2V-Linux 迁移...
现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库类型 如:(orcal,sqlServer,csv 迁移至mysql) 2.在迁移数据库时,可以只迁移指定字段. 3.开发多任务的平台,按权重去执行任务,如:...
Oracle 数据迁移是一个复杂的过程,涉及将数据从一个数据库系统迁移到另一个数据库系统,例如从 SQL Server 迁移到 Oracle。在本案例中,我们探讨了四种不同的Oracle数据迁移方案,每种都有其特定的方法和工具。 **...
微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx
Oracle导Mysql适用于百、千万级别数据迁移,速度是kettle的10倍以上数据库迁移 数据迁移 千万级 亿万级数据,MySQL oracle关系型 现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库...
Oracle数据库的升级与迁移是IT领域中的重要任务,涉及到企业数据的安全性和业务连续性。本篇文章将基于"Oracle升级-数据库迁移(part4 update)"的主题,结合提供的文档资源,详细阐述这一过程的关键知识点。 首先...
数据迁移是IT环境中常见的任务,尤其在数据库管理中扮演着至关重要的角色。本文将深入探讨“数据迁移工具”,特别是针对DB2、Oracle、SQL Server和MySQL等主流数据库间的数据迁移。我们将讨论相关工具、迁移过程、...
标题中的“Hadoop数据迁移--从Oracle向Hadoop”指的是将传统的Oracle数据库中的数据迁移到分布式计算框架Hadoop中。这个过程通常涉及到大量的数据处理和转换,以适应Hadoop的存储和处理方式。Hadoop主要由HDFS...
使用MapReduce进行数据迁移的好处是可以有效地处理大量数据,同时MapReduce框架能够自动处理数据的并行处理、负载均衡、容错等复杂问题,简化了程序的开发和维护工作。但是,这种方式也存在一些挑战,比如需要合理地...
- 当虚拟机包含复杂的应用程序设置时,使用冷迁移可以在不启动虚拟机的情况下进行迁移,减少兼容性问题导致的迁移失败风险。 - 对于需要跨数据中心或跨`vCenter Server`实例迁移的情况,冷迁移提供了一种简便高效...
标题中的"GPR-基尔霍夫迁移-成像-技术"指的是地质雷达(Ground-Penetrating Radar,GPR)采用基尔霍夫迁移算法进行数据处理和图像生成的技术。GPR是一种非破坏性的地下探测技术,通过发射高频电磁波到地表下,接收...
1. 在Map阶段,程序读取HDFS中的数据文件,将数据分割成可以处理的块,并为每个块创建键值对,键通常与Oracle数据库的表结构相对应,值则是需要迁移的数据。 2. Map任务的输出将发送给Reduce任务,但在此场景中可能...
WebSphere迁移是IT系统中常见的操作,尤其在企业级应用环境中,为了更新硬件、软件升级或优化资源分配,可能需要将WebSphere应用程序服务器从一个环境迁移到另一个环境。中科软科技股份有限公司的这份“FI-平台实施...
这个程序会提供一个直观的用户界面,引导你完成整个迁移过程。 2. 在工具中输入FTP服务器的详细信息,包括主机名、端口(默认为21)、用户名和密码。 3. 选择需要迁移的文件或目录。工具通常会列出FTP服务器上的所有...
6. **导库工具**:这个文件可能是数据迁移工具的一部分,可能包含了用于导入或导出数据库对象和数据的实用程序。它可以是一个图形界面工具,也可以是命令行工具,用于执行实际的数据迁移操作。 7. **最佳实践**:在...
【标题】"基于PHP的KISETL开源轻量级数据迁移程序php版源码.zip" 涉及的核心知识点是PHP编程语言以及数据迁移技术。在这个项目中,开发者使用PHP来构建一个轻量级的数据迁移工具,这展示了PHP在处理非Web应用任务中...
数据迁移整合是IT领域中常见的任务,特别是在系统升级或新旧系统替换时。在这个报告中,我们关注的是如何有效地进行历史数据迁移和不同系统间的整合,以确保业务的连续性和系统的稳定性。 首先,新老系统迁移整合的...