`
superxielei
  • 浏览: 266633 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

批量生产数据时,效率是关键.

    博客分类:
  • java
阅读更多

昨天被安排了一个任务,要生成抚顺地区所有的联通和移动的手机号,最后要随机导出,每50W一个文本.

开发思路是先找到所有的抚顺号段,然后生成号段下所有的手机号,最后随机导出成文本.

看了一下我们的数据库,抚顺地区所有的号段一共有32个(可能不够,不过我们的数据库里就这么多,酬和用吧.不少了.),每个号段下有10000个号,最近就是3200000个手机号..

生成号码不是难事.关键是生成代码以后,从数据库中取出320W数据,然后要随机排列输出,尝试了各种办法以后终于还是失败,总是会内存溢出,要不然就是效率太低..

晚上回家突然想到一个办法,我何必要最后随机抽出数据呢?为什么不直接就做出随机的数据呢?让数据在数据库中随机保存,然后之后分页查询,每次查询50W保存文件就OK了啊...早上到单位一试验果然有效..

首先是生成随机数据的地方.随机数据并不是说手机号码随机生成,如果随机生成号码还有验证是否重复很麻烦,直接随机生成主键ID,然后保存呵呵,一切OK.

int index = 0;
		int number = 0;
		String numberStr = "";
		String part = "";
		
		String pattern = "0000 "; 
		DecimalFormat df = new DecimalFormat(pattern); 
		
		Connection connection = ormDao.jdbcTemplate.getConnection();
		connection.setAutoCommit(false);  
		String sql = "insert INTO t_phonexy (id,phone,part,number,prefix) values (?,?,?,?,?)";  
		PreparedStatement prest = connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
		
		//生成4000000万个ID.使用LinkedList提高插入效率
		List<Integer> ids = new LinkedList<Integer>();
		while(number < 4000000){
			ids.add(number);
			number++;
		}
		//对400W个ID随机打乱随机.
		Collections.shuffle(ids);
		//将LinkedList转换为数组,提高取数据的效率
		Integer[] idss = new Integer[400000];
		idss = ids.toArray(idss);
		//记录取数索引
		int idsIndex = 0;
		
		for(index = 0 ;index<parts.length;index++){
			part = parts[index];
			number = 0;
			while(number < 10000){
				numberStr = df.format(number);
				//虽然这里是顺序取出,但是之前已经打乱过顺序,所以ID自然也是乱序的.
				prest.setInt(1,idss[idsIndex]);
				idsIndex++;
				prest.setString(2,part+numberStr);
				prest.setString(3,part);
				prest.setString(4,numberStr);
				prest.setString(5,part.substring(0, 3));
				prest.addBatch();
				
				number++;
			}
			prest.executeBatch();  
			connection.commit(); 
		}

 数据库MySql5.0  表类型MyISAM.只有主键索引.  耗时 :0时-9分-35秒

我又测试了一下,注释掉随机主键部分的代码,看看耗时是多少.耗时 :0时-8分-46秒

只慢了不到一分钟,只慢了49秒而已~~

剩下的工作就简单多了,取出数据,生成文件.

Class.forName("com.mysql.jdbc.Driver");
		Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/xbexam?characterEncoding=UTF-8", "root", "123123");
//		Connection connection = ormDao.jdbcTemplate.getConnection();
		Statement statement = connection.createStatement();
		ResultSet resultSet = statement.executeQuery(sql);
		System.out.println("=====数据库访问结束=======");
		List<String> list = new LinkedList<String>();
		while(resultSet.next()){
			list.add(resultSet.getString("phone"));
		}
int count = 0;
		int fileCount = 0;
		while(iterator.hasNext()){
			if(count > 500000){
				//写出文件
				File file = new File("d:/"+fileCount+".txt");
				fileCount++;
				file.createNewFile();
				FileWriter fileWriter = new FileWriter(file);
				fileWriter.write(buffer.toString());
				fileWriter.flush();
				fileWriter.close();
				
				count = 0;
				buffer = new StringBuffer();
			}
			buffer.append(iterator.next()+"\r\n");
			count++;
		}
		
		//写出文件
		File file = new File("d:/"+fileCount+".txt");
		fileCount++;
		file.createNewFile();
		FileWriter fileWriter = new FileWriter(file);
		fileWriter.write(buffer.toString());
		fileWriter.flush();
		fileWriter.close();
 

生成文件..耗时 :0时0分-13秒...简直~~~简直~~

一切都搞定了..呵呵~~代码要留好,不一定什么时候还能用得上.

分享到:
评论

相关推荐

    Delphi批量插入数据库数据..rar

    批量插入数据是数据库操作中的常见需求,尤其是在处理大量数据时,为了提高效率和减少网络往返,通常会采用这种方式。在Delphi中,我们可以使用不同的方法来实现这个功能,如使用SQL语句、ADO(ActiveX Data Objects...

    Java_批量导出大数据量Excel方法.zip

    本资料"Java_批量导出大数据量Excel方法.zip"包含两个关键文件:excelproj和ExpXLS,它们可能是项目的源代码或示例,用于演示如何实现这个功能。 1. **Apache POI库**: Apache POI是Java中广泛使用的库,用于读写...

    ThinkPHP 批量添加数据

    在IT行业中,数据库操作是应用开发中的重要环节,尤其是在处理大量数据时,高效的批量添加数据方法显得尤为关键。ThinkPHP,作为一个流行的PHP框架,提供了便捷的API和工具来实现这样的功能。本文将针对"ThinkPHP ...

    批量数据加载与存储实验.doc.zip

    在IT行业中,批量数据加载与存储是大数据处理和分析领域中的关键环节,它涉及到如何高效地将大量数据导入到数据库、数据仓库或者分布式存储系统中,并确保数据的完整性和一致性。这个过程通常需要考虑性能、容错性...

    C# Access 大数据量 批量 效率 快速 导入

    在C#编程环境中,处理大数据量的导入任务时,效率是非常关键的一环。"C# Access 大数据量 批量 效率 快速 导入"这个主题聚焦于如何利用C#语言高效地将大量数据批量导入到Access数据库中。Access作为一个小型数据库...

    neo4j批量数据导入

    通过理解和应用上述知识点,我们可以有效地实现Neo4j的批量数据导入,提高数据处理的效率。对于给定的压缩包"neo4j-batch",其内容可能包括了上述提到的Java源代码和相关的测试数据文件。通过分析这些文件,我们可以...

    txt_batch_rename_txt文档批量改名_批量读取并另存.txt数据文档_源码.zip

    该压缩包文件“txt_batch_rename_txt文档批量改名_批量读取并另存.txt数据文档_源码.zip”主要涉及的是一个针对txt文本文件的批量处理程序,包括两个关键操作:批量改名和批量读取并另存。下面将详细解释这两个知识...

    批量为电商数据添加tag标签.zip

    在电商行业中,对数据进行精细化管理是提升运营效率的关键步骤之一。这个压缩包“批量为电商数据添加tag标签.zip”包含了一个使用Python编程语言实现的案例,旨在帮助用户批量处理电商平台的数据,为商品或者订单等...

    C#批量导入数据

    对于C#开发者来说,处理大量数据的导入能够显著提高工作效率,特别是在处理大数据集时。本篇将深入探讨如何在C#环境中进行批量导入数据,以及相关的关键知识点。 标题“C#批量导入数据”暗示我们将关注的是如何使用...

    ArrayList数据批量添加数据

    2. **性能考虑**: 当处理大量数据时,应考虑使用参数化查询和存储过程来提高效率和安全性。 3. **资源管理**: 使用`using`语句自动释放资源,避免内存泄漏等问题。 #### 总结 本文介绍了如何使用`ArrayList`批量...

    个性化产品的批量生产促进了机器人的发展.pdf

    在当前的技术前沿,机器人在制造业中的角色正在发生深刻变革,这主要得益于个性化产品的批量生产需求。传统工业生产强调规模经济,但随着消费者对个性化产品需求的增长,制造商必须转向更灵活的自动化解决方案。这种...

    论文研究-海量数据快速批量处理的研究与实现.pdf

    本文是关于海量数据快速批量处理的研究与实现的论文,重点研究了在数据库应用中如何快速大批量抽取和处理数据,并针对特定需求提出了基于共性特征的数据集进行交互式批量处理和批量加工的实现方法。 1. 海量数据的...

    ASP 批量插入数据

    在ASP(Active Server Pages)开发中,批量插入数据是一个常见的需求,特别是在处理大量记录时,为了提高效率,避免频繁的数据库交互,批量插入是必不可少的技术。本文将详细讲解如何在ASP中实现批量插入数据,以及...

    数据的批量处理

    下面将详细探讨数据批量处理的关键概念、应用场景以及常用工具。 一、批量处理的定义与优势 批量处理是指在特定时间间隔内,对一组数据进行集中式的处理,而不是逐个处理每个数据项。这种处理方式的优势在于: 1. ...

    如何使用origin批量处理数据.docx

    以下是如何使用Origin进行批量处理数据的详细步骤和一些关键知识点: 1. **数据导入**:首先,你需要将你的数据源导入到Origin中。Origin支持多种数据格式,如CSV、TXT、Excel等。导入数据后,数据会以表格的形式...

    批量配置工具V3.0.2.6.rar

    在描述中提到的“改IP软件”,指的是它能够批量修改网络设备的IP配置,包括IP地址、子网掩码、默认网关以及DNS服务器等关键网络参数。这在需要为新接入网络的设备分配IP地址,或者在进行网络结构调整时尤其有用。...

    基于SQL优化提高数据仓库的ETL效率的方案.pdf

    这包括对批量数据进行删除、更新和插入操作时的优化。在数据仓库的环境中,可能需要结合复杂的表连接操作,正确地使用游标和SQL语句可以保证数据处理的效率和数据质量。 8. 表和索引的分离 为了提高数据仓库中数据...

    C# 批量插入和更新数据

    本案例展示了如何使用C#结合ADO.NET进行批量数据插入的操作。具体步骤如下: 1. **初始化参数**:首先定义了一个`DateTime`类型的变量`begin`用于记录开始时间,并通过`connectionString`连接数据库。 2. **创建...

    批量导入Excel数据到数据库,带数据校验/事务回滚

    在.NET开发环境中,批量导入Excel数据到数据库是一项常见的任务,特别是在数据分析、系统集成或报表生成等场景中。本文将深入探讨如何实现这个过程,并重点讨论数据校验和事务回滚两个关键环节。 首先,批量导入...

Global site tag (gtag.js) - Google Analytics