`
Donald_Draper
  • 浏览: 979879 次
社区版块
存档分类
最新评论

百万级数据-程序迁移

阅读更多
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,关于分页分批插入(为应对内存问题,可以将查询结果存到文件,再从文件中读取插入),后续再讲。
主要代码:
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==========
再大,只能用工具迁移了。











  • 大小: 58 KB
  • 大小: 32.5 KB
  • 大小: 55.2 KB
  • 大小: 31.3 KB
  • 大小: 44.5 KB
  • 大小: 30.8 KB
1
0
分享到:
评论

相关推荐

    P2v-linux迁移(从物理机迁移到虚拟机)

    3. 迁移执行:根据虚拟机的配置文件,执行迁移过程,并将物理机的操作系统、应用程序和数据迁移到虚拟机中。 四、P2V-Linux 迁移的优点 P2V-Linux 迁移具有以下几个优点: 1. 提高服务器的可用性:P2V-Linux 迁移...

    数据库迁移 数据迁移 千万级 亿万级数据MySQL oracle关系型

    现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库类型 如:(orcal,sqlServer,csv 迁移至mysql) 2.在迁移数据库时,可以只迁移指定字段. 3.开发多任务的平台,按权重去执行任务,如:...

    Oracle项目-数据迁移.ppt

    Oracle 数据迁移是一个复杂的过程,涉及将数据从一个数据库系统迁移到另一个数据库系统,例如从 SQL Server 迁移到 Oracle。在本案例中,我们探讨了四种不同的Oracle数据迁移方案,每种都有其特定的方法和工具。 **...

    微信小程序迁移申请函.docx

    微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx微信小程序迁移申请函.docx

    Oracle导Mysql适用于百、千万级别数据迁移

    Oracle导Mysql适用于百、千万级别数据迁移,速度是kettle的10倍以上数据库迁移 数据迁移 千万级 亿万级数据,MySQL oracle关系型 现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库...

    Oracle升级-数据库迁移(part4 update)

    Oracle数据库的升级与迁移是IT领域中的重要任务,涉及到企业数据的安全性和业务连续性。本篇文章将基于"Oracle升级-数据库迁移(part4 update)"的主题,结合提供的文档资源,详细阐述这一过程的关键知识点。 首先...

    数据迁移工具

    数据迁移是IT环境中常见的任务,尤其在数据库管理中扮演着至关重要的角色。本文将深入探讨“数据迁移工具”,特别是针对DB2、Oracle、SQL Server和MySQL等主流数据库间的数据迁移。我们将讨论相关工具、迁移过程、...

    Hadoop数据迁移--从Oracle向Hadoop.zip

    标题中的“Hadoop数据迁移--从Oracle向Hadoop”指的是将传统的Oracle数据库中的数据迁移到分布式计算框架Hadoop中。这个过程通常涉及到大量的数据处理和转换,以适应Hadoop的存储和处理方式。Hadoop主要由HDFS...

    Hadoop数据迁移--从Oracle向Hadoop

    使用MapReduce进行数据迁移的好处是可以有效地处理大量数据,同时MapReduce框架能够自动处理数据的并行处理、负载均衡、容错等复杂问题,简化了程序的开发和维护工作。但是,这种方式也存在一些挑战,比如需要合理地...

    虚拟化技术-冷迁移概念.pptx

    - 当虚拟机包含复杂的应用程序设置时,使用冷迁移可以在不启动虚拟机的情况下进行迁移,减少兼容性问题导致的迁移失败风险。 - 对于需要跨数据中心或跨`vCenter Server`实例迁移的情况,冷迁移提供了一种简便高效...

    GPR-基尔霍夫迁移-成像-技术

    标题中的"GPR-基尔霍夫迁移-成像-技术"指的是地质雷达(Ground-Penetrating Radar,GPR)采用基尔霍夫迁移算法进行数据处理和图像生成的技术。GPR是一种非破坏性的地下探测技术,通过发射高频电磁波到地表下,接收...

    Hadoop数据迁移--从Hadoop向Oracle

    1. 在Map阶段,程序读取HDFS中的数据文件,将数据分割成可以处理的块,并为每个块创建键值对,键通常与Oracle数据库的表结构相对应,值则是需要迁移的数据。 2. Map任务的输出将发送给Reduce任务,但在此场景中可能...

    FI-平台实施文档-WebSphere迁移.doc

    WebSphere迁移是IT系统中常见的操作,尤其在企业级应用环境中,为了更新硬件、软件升级或优化资源分配,可能需要将WebSphere应用程序服务器从一个环境迁移到另一个环境。中科软科技股份有限公司的这份“FI-平台实施...

    fly.box企业网盘-FTP迁移工具及使用教程

    这个程序会提供一个直观的用户界面,引导你完成整个迁移过程。 2. 在工具中输入FTP服务器的详细信息,包括主机名、端口(默认为21)、用户名和密码。 3. 选择需要迁移的文件或目录。工具通常会列出FTP服务器上的所有...

    oracle数据迁移工具

    6. **导库工具**:这个文件可能是数据迁移工具的一部分,可能包含了用于导入或导出数据库对象和数据的实用程序。它可以是一个图形界面工具,也可以是命令行工具,用于执行实际的数据迁移操作。 7. **最佳实践**:在...

    基于PHP的KISETL开源轻量级数据迁移程序php版源码.zip

    【标题】"基于PHP的KISETL开源轻量级数据迁移程序php版源码.zip" 涉及的核心知识点是PHP编程语言以及数据迁移技术。在这个项目中,开发者使用PHP来构建一个轻量级的数据迁移工具,这展示了PHP在处理非Web应用任务中...

    人像美妆-妆容迁移DEMO

    "人像美妆-妆容迁移DEMO"是一个用于展示这种技术的示例程序,它能够实现与流行的美妆相机类似的功能,自动为人像应用各种不同的妆容风格。 1. **妆容迁移**:妆容迁移是人像美妆技术中的核心部分,它涉及到将一种...

Global site tag (gtag.js) - Google Analytics