索引排序文件--不排序数据排序索引暨介绍大数据常用的显示数据的两种方式
来源:互联网 发布:淘宝比价格的软件 编辑:程序博客网 时间:2024/05/22 08:01
本文讲述近期大数据处理的心得:以索引排序文件--不排序数据排序索引 为例剖析大数据常用的显示数据的两种方式
应用一:根据键盘输入的行数,打印文件对应的行数数据以及后几行数据
已知:
CSDNdataSortindexlast不排序数据的排序索引文件--索引排序文件
CSDN数据原文件
CSDNdataSort为格式化并排序文件
目标详述--根据输入的行数,获得查询类似已经排序好(CSDNdataSort)文件对应 的前几行,但是数据只是对原文件CSDN的索引进行了排序CSDNdataSortindexlast
即处理原文件只有只读属性欲获得得到文件排序操作后对应的效果
1、加载内存的方法(此处数据类型为int类型的索引)
public static void getfile( int []index,String path) throws IOException { System.out.println("init start"); int line=0; BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(path),"GBK"));//设定缓冲区 String str=null; while((str=br.readLine())!=null) { index[line]= Integer.parseInt(str);//读取字符串转化为整数 line++; } br.close(); System.out.println("init end"); }
2、数据显示到控制台的方法--显示对应数据以及其后的20行
//RandomAccessFile读的是不排序数据--打印到控制台 public static void show(int [] index,int line,String path) throws FileNotFoundException, IOException { System.out.println("show start"); RandomAccessFile raf=new RandomAccessFile(path,"r");//只读的打开随机访问文件 for(int i=0;i<20;i++) { raf.seek(index[line+i]);//移动文件指针--每次移动到line+i 及位置+i以内的数据 String str1=new String(raf.readLine().getBytes("ISO-8859-1"),"GBK"); System.out.println(str1); } raf.close(); System.out.println("show end"); }
3、测试
final int N=6428632; int [] index =new int[N+1];//索引=id+1 //CSDNdataSortindexlast不排序数据的排序索引文件--索引排序文件 String pathIn="C:\\大数据data\\CSDN\\CSDNdataSortindexlast.txt"; getfile( index,pathIn) ;//把 不排序数据的排序索引文件(CSDNdataSortindexlast) 载入内存 注意index为int,读到的值为String String path="C:\\大数据data\\CSDN\\CSDN.txt"; while(true)//根据输入的行数,获得已经排序好(CSDNdataSort)文件对应 的前几行 { String inputstr=JOptionPane.showInputDialog("输入你要查看的行数"); int line=Integer.parseInt(inputstr);//数据转换 //随机读取文件读取RandomAccessFile 乱序文件--seek定位到(line),若输出其以后多条,用for循环内line+i show( index,line,path);//显示索引的位置上数据 }
应用二、根据输入的文本输出对应包含该该文本的具体信息
目标详述--根据输入的文本,把不排序数据的排序索引加载内存,RandomAccessFile读CSDN,进行二分法查找
方法:把不排数据排索引 CSDNdataSortindexlast 载入内存,随机存储文件 读 原文件CSDN并根据user字段进行二分查找。注:raf.seek(index[mid]);
rdstr=raf.readLine(); raf.close(); rdstr根据#切割,并取数组第0个为文件user
1、二分法查找
public static void binsearch(int N,int []index,String path) throws IOException{ String str=JOptionPane.showInputDialog("输入要查询的账户"); str=str.trim();//删除 int max=N; int min=0; int times=0; boolean isfind=false; System.out.println( "开始检索"); while(min<=max) { times++; int mid=(max+min)/2; RandomAccessFile raf=new RandomAccessFile( path,"r");//读取 raf.seek(index[mid]);//随机读文件RandomAccessFile 的seek小标是不排序数据的排序索引index[mid]参数是二分查找的mid的值 String rdstr=raf.readLine(); raf.close(); String [] fl=rdstr.split(" # "); String lastuser=fl[0].trim();//取出user if(str.compareTo(lastuser)<0) { max=mid-1; } else if(str.compareTo(lastuser)>0) { min=mid+1; } else if(str.compareTo(lastuser)==0) { System.out.println(rdstr);//打印 isfind=true; break; } } if(!isfind) { System.out.println("没有找到");//打印 } else { System.out.println("找到");//打印 } System.out.println( times+"次"); }2、测试
final int N=6428632; int [] index =new int[N+1]; String pathIn="C:\\大数据data\\CSDN\\CSDNdataSortindexlast.txt"; getfile( index,pathIn) ;//读不排序数据的 排序索引:CSDNdataSortindexlast String path="C:\\大数据data\\CSDN\\CSDN.txt"; while(true) { binsearch(N,index,path); }
附:生成对内存中索引进行快速排序--CSDNdataSortindexlast
思路:把CSDN文件载入内存,并生成索引,对索引与源文件进行快排,将‘不排数据排索引’写入本地CSDNdataSortindexlast
1、由CSDN文件生成不排序文件的排序索引,载入内存
public static void init( String []data,int [] index,int [] iddata,String path ) throws IOException { System.out.println("init start"); int line=0; int indexline=0; InputStreamReader isr=new InputStreamReader(new FileInputStream(path),"GBK"); BufferedReader br=new BufferedReader(isr);//设定缓冲区 String str=null; index[indexline]=0;//第一行索引为0 while((str=br.readLine())!=null) { indexline++; byte[] bt=str.getBytes("GBK"); byte[] lt="\r\n".getBytes("GBK"); index[indexline]=bt.length+lt.length;//精确//--读的这一行的长度给索引数组 data[line]=str; //--读的这一行的内容给数据data数组 iddata[line]=line;//00 11 12//--读的这一行的行号给下标数组数组 line++; } br.close(); System.out.println("init end"); //索引累加 for(int j=1;j<index.length;j++) { index[j]+= index[j-1];//把读的这一行长度的索引数组加上上一行 } }
2、对内存中索引进行快速排序
public static void Qsortplus( int [] index,String []data,int []iddata, int low,int high) { if(low < high) { int lt=low; int gt=high;//左边,右边 int i=low+1;//开始循环位置 int temp=index[low];//保存第一个数据 int id=iddata[low];//对应的小标值 String datastr=data[id];//下标对应的数据data值 while(i<=gt)//循环夹逼 { String istr=data[iddata[i]]; String [] stl1=datastr.split(" # "); String [] stl2=istr.split(" # "); if(stl2[0].trim().compareTo(stl1[0].trim()) <0) //小于[0]=user { swap(index, lt,i);//移动 swap(iddata, lt,i);//移动 lt++; i++; } else if(stl2[0].trim().compareTo(stl1[0].trim()) >0)//大于 { swap(index,i,gt);//移动 swap(iddata,i,gt);//移动 gt--; } else { i++; } } Qsortplus( index,data,iddata, low,lt-1); Qsortplus( index,data, iddata,gt+1,high);//分段 } }3、把排序了的索引写入文件--对内存中索引进行快速排序
public static void tofile( int []index,String path) throws IOException { System.out.println("file start"); OutputStreamWriter otr=new OutputStreamWriter (new FileOutputStream(path),"GBK"); BufferedWriter bw=new BufferedWriter(otr); for(int i=0;i<index.length;i++) { bw.write(index[i]+"\r\n"); } bw.close(); System.out.println("file end"); }
4、测试
final int N=6428632; int [] index =new int[N+1];//索引 String []data =new String[N];//数据 int [] iddata =new int[N];//id //加载到索引到内存-只需length长度+\r\n,;排序时可以根据某一个数排,可以用split //生成不排序文件的排序索引,载入内存 String path="C:\\大数据data\\CSDN\\CSDN.txt"; init( data , index,iddata,path);//init传递3个数组 System.out.println("sort start"); //对内存中索引进行快速排序 Qsortplus( index,data,iddata, 0,index.length-2);//最后一个参数=N-1,参数增加了2个数组 System.out.println("sort end"); //把排序了的索引写入文件 String pathIn="C:\\大数据data\\CSDN\\CSDNdataSortindexlast.txt"; tofile( index,pathIn);//把不排序数据的排序索引--写入文件CSDNdataSortindexlast ,把索引写入文件
0 0
- 索引排序文件--不排序数据排序索引暨介绍大数据常用的显示数据的两种方式
- 大数据的排序问题
- 大数据的排序策略
- 大数据排序的几种方法
- NoSQL——数据索引与排序
- 转载大数据排序 很好的思想
- 单机对大数据的排序处理
- 大数据排序的思想和算法
- 大数据下的字典与排序
- 大数据的查找与排序
- 转载大数据排序 很好的思想
- 转载大数据排序 很好的思想
- mysql分组排序去数据的方式
- 关于数据的排序
- 大链表数据的排序
- 数据排序的问题
- cassandra的数据排序
- 海量数据的排序
- Group Anagrams
- HTTP Status 404 - There is no Action mapped for namespace [/] and action name [c_list] associated wi
- Android OpenGLES2.0(十三)——流畅的播放逐帧动画
- SSL/TLS算法流程解析
- C++面试宝典2011版
- 索引排序文件--不排序数据排序索引暨介绍大数据常用的显示数据的两种方式
- 简述什么是框架
- 如何转载博客
- Qt 点线效果
- Android开发——RecyclerView特性以及基本使用方法(二)
- Android学习笔记--BaseActivity和BaseFragment的再抽取
- 处子之身写博客
- pycharm上安装使用easygui
- android学习的一些看法