大文件读写优化问题。现有两个文件,一个837M的order.tbl,一个3.62G的lineitem.tbl,对这两个表进行嵌套连接
在做数据库作业时遇到的优化问题!
作业要求:
实现一个基于嵌套循环策略的两表连接算法
• 算法原理:
FOR EACH CHUNK c1 OF t1 {IF c1 NOT IN MEMORY READ CHUNK c1 INTO MEMORYFOR EACH ROW r1 IN CHUNK c1 {FOR EACH CHUNK c2 OF t2 {IF c2 NOT IN MEMORYREAD CHUNK c2 INTO MEMORYFOR EACH ROW r2 IN c2 {IF r1,r2 SATISFIES JOIN CONDITIONSJOIN r1,r2}}}
}
• 数据集:TPC-H数据集
– 参与连接的两个数据表,数据量较大,无法同时一次性放进内存
» 生成5GB的数据时,orders表大小为837MB,lineitem表大小为3.62GB
» 在此作业中,将基于这两个表的数据来进行连接
» 数据生成器:https://pan.baidu.com/s/1s_4P-nVDo-L1qjWdbugE1w
• 实验环境
单核CPU,CentOS 6.4,4GB内存
数据生成方法见:http://www.docin.com/p-1297678266.html?qq-pf-to=pcqq.group
TPC-H数据集中order表和lineitem表结构如下:
生成的表是这样的8张表
生成表.tbl中的数据形式如下:
现在需要做的是读入orders.tbl和lineitem.tbl两表中的数据,然后使用orders.tbl表中的O_ORDERKEY和lineitem.tbl表中的L_ORDERKEY先比较,如果相等就连接成一条数据。
两表连接程序代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;public class T_Con{public static void main(String[] args) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");long startTime=System.currentTimeMillis(); System.out.println("startTime = "+df.format(startTime));try {table_connect();} catch (IOException e) {e.printStackTrace();}long endTime=System.currentTimeMillis(); System.out.println("endTime = "+df.format(endTime));long total_time = endTime-startTime;System.out.println("runtime is "+total_time/1000+"s"); System.out.println("runtime is "+(total_time/60000)+" minutes "+(total_time%60000)/1000+" seconds");}/*** table connect */public static void table_connect() throws IOException{String or_filname = "orders.tbl";String lin_filname = "lineitem.tbl";String O_L_filename = "result.tbl";int or_buf_byte = 128*1024*1024;int lin_buf_byte = 256*1024*1024;int write_bur_byte = 8*1024*1024;int sOrders = -1;int slineitem = -1;String temp_lin = null;String temp_or = null;String temp_or_sub = null;BufferedReader FOrdersInBR = read_Orders(or_filname,or_buf_byte);BufferedReader FlineitemInBR = read_lineitem(lin_filname,lin_buf_byte); BufferedWriter wtable = write_creat(O_L_filename,write_bur_byte); while((temp_or = FOrdersInBR.readLine()) !=null){sOrders = Integer.parseInt(temp_or.split("\\|")[0]);temp_or_sub = temp_or.substring(temp_or.indexOf("|")+1);if(sOrders < slineitem){continue;}if(slineitem != -1 && slineitem == sOrders){temp_lin += temp_or_sub;temp_lin += "\n";wtable.write(temp_lin);}while((temp_lin = FlineitemInBR.readLine()) != null){slineitem = Integer.parseInt(temp_lin.split("\\|")[0]); if(slineitem > sOrders){ break;} if(slineitem == sOrders){ temp_lin += temp_or_sub;temp_lin += "\n";wtable.write(temp_lin); } } } wtable.flush();wtable.close(); FOrdersInBR.close(); FlineitemInBR.close(); }/***read Orders table datas to stor memory*/public static BufferedReader read_Orders(String or_filname,int or_buf_byte){BufferedReader FOrdersInBR = null;try {FOrdersInBR = new BufferedReader(new InputStreamReader(new FileInputStream(or_filname)),or_buf_byte);} catch (FileNotFoundException e) {System.out.println("Read orders file failed!");e.printStackTrace();}return FOrdersInBR;}/***read lineitem table datas to stor memory*/public static BufferedReader read_lineitem(String lin_filname,int lin_buf_byte){BufferedReader FlineitemInBR = null;try {FlineitemInBR = new BufferedReader(new InputStreamReader(new FileInputStream(lin_filname)),lin_buf_byte);} catch (FileNotFoundException e) {System.out.println("Read lineitem file failed!");e.printStackTrace();}return FlineitemInBR;} /*** creat write file* */public static BufferedWriter write_creat(String O_L_filename,int write_bur_byte){File wfilename = new File(O_L_filename);if(!wfilename.exists()){try {wfilename.createNewFile();} catch (IOException e) {System.out.println("create write file failed!");e.printStackTrace();}}BufferedWriter wtable = null;try {wtable = new BufferedWriter(new FileWriter(wfilename),write_bur_byte); } catch (IOException e) {System.out.println("open write file failed!");e.printStackTrace();}return wtable;}}
把这个程序放在VMware虚拟机下面跑,时间会比较长,我跑出来的最短时间为141s。跑程序的时候发现不是缓冲越大越好,这是为什么,如果把orders.tbl一次全部读入内存,发现跑得更慢,现在想对该程序进行优化,使得更快!请各位大神看下!
(by:CHENYUNHE 2018-12-30 https://blog.csdn.net/CHENYUNHE/)
大文件读写优化问题。现有两个文件,一个837M的order.tbl,一个3.62G的lineitem.tbl,对这两个表进行嵌套连接相关推荐
- plist文件读写,序列化与反序列化,文件的读写[xcode4.4.1]
这篇学习目标: plist文件读写 对象序列化与反序列化 本地文件的读写 iCloud存储的API 引言 在做iOS开发时,经常用到到plist文件, 那plist文件是什么呢? 它全名是:Prop ...
- C语言文件读写操作,写入数据到文件
很早写的在linux系统下的文件读写操作,写入数据到文件,很时候初学者学习 #include <stdio.h>int writeInfoToFile(char *strFile) {in ...
- 从磁盘原理理解文件读写优化
目录 案例背景 磁盘结构 盘面 磁道 柱面 启停区或着陆区(LandingZone) 扇区 读写过程 磁盘碎片的产生(1) 希捷硬盘读写性能测试报告 文件碎片 文件碎片定义 产生 原因 文件碎片和连续 ...
- python中io.textio_Python文件读写概述(IO操作、文件读写、stringiobytesio、序列化),python,的,小,总结,StringIOBytesIO...
IO操作 在进行文件的读写之前,需要说明几点.首先,运行的程序和读取的数据都会在内存中缓存. 进入到 程序或数据 内存 其次,用python程序进行文件的读写,需要创建一个小工具–文件流,用来处理数据 ...
- python中文件读写位置的作用-Python中文件的读写、写读和追加写读三种模式的特点...
本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) ...
- python中文件读写位置的作用-Python中文件的读写
1.Python中的open()函数 Python中提供了open()内置函数,在默认情况下可以对文件对象进行操作. open()函数将文件名作为唯一必不可少的参数,并返回一个文件对象.如果只指定一个 ...
- python 文件读写 newline_「Python」:文件读写
原标题:「Python」:文件读写 ##############txt文件读写################## # txt文件:记事本文件,一般用来存储测试日志 # 方式1: 不推荐,每次读写结束 ...
- python 异步文件读写_Python中使用asyncio 封装文件读写
前言 和网络 IO 一样,文件读写同样是一个费事的操作. 默认情况下,Python 使用的是系统的阻塞读写.这意味着在 asyncio 中如果调用了 f = file('xx') f.read() 会 ...
- Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化
BytesIO StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO.BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes: 写 ...
最新文章
- 如何使用OpenCV实现图像均衡???
- 梅尔频率倒谱系数(MFCC)资源
- 【迁移学习(Transfer L)全面指南】不需要时关闭autograd的方法:torch.no_grad
- 宅福利-宅家抗疫,你我同在2020-01-30
- osg::ComputeBoundsVisitor用法(二)
- C++ Editbox换行问题
- C#语言入门详解---委托(刘铁猛)
- springmvc log4j配置
- Linux中如何使用帮助
- dajngo3设置静态文件访问
- 未能打开组策略对象 您可能没有合适的权限
- Windows系统下载安装MinGW(包括32位和64位)
- 火狐浏览器添加restclient.xpi 添加插件时候遇见的 附件未经验证无法安装
- ps3 自制系统的C 语言,老树发新芽:PS3自制系统的使用与研究
- 联想计算机启机按F1,电脑开机提示按f1不能正常启动怎么办
- デュナリス / 风奶
- 计算机大型机小型机的缩写,计算机可被划分为3个基本类型大型机,小型机与微型机。.doc...
- win11一直弹出用户账户控制怎么解决
- 微信公众平台开发2-access_token获取及应用(含源码)
- angular ngRoute
热门文章
- 手绘和码绘的对比(2)——动态比较
- win32中使用打印机
- “工科生”的浪漫 百度大脑语言与知识技术峰会在七夕向你发出参会邀请
- 【译】潜在语义分析Latent Semantic Analysis (LSA)
- e^x的麦克劳林展开式
- 服务器发送wifi信号,改变WIFI无线路由信号弱的解决方案:利用发送噪音
- Flutter设置按钮disable
- 便携计算机主机,一种计算机主机用便携式移动装置及其使用方法与流程
- 2014网络最有实力的十大红人与网络十大红人资料(全网公正)全网转载!
- c语言单身狗题目罩得住学长,看到就是赚到!心理学教授研究多年,只为谈不了恋爱的你...