当前位置: 首页 > news >正文

成都网站设计师聊城专业网站建设公司电话

成都网站设计师,聊城专业网站建设公司电话,高水平的徐州网站建设,网站建设合同或方案书一、问题描述 有一个大文件#xff0c;里面有十亿个字符串#xff0c;乱序的#xff0c;要求将这些字符串以字典的顺序排好序 二、解决思路 将大文件切割成小文件#xff0c;每个小文件内归并排序#xff1b; 对所有的小文件进行归并排序——多重归并排序 三、解决方案 3.… 一、问题描述 有一个大文件里面有十亿个字符串乱序的要求将这些字符串以字典的顺序排好序   二、解决思路     将大文件切割成小文件每个小文件内归并排序     对所有的小文件进行归并排序——多重归并排序   三、解决方案 3.1 模拟产生10亿个随机字符 public static void generateDate() throws IOException {BufferedWriter writer new BufferedWriter(new FileWriter(ORIGINALPATH));Random random new Random();StringBuffer buffer new StringBuffer(0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ);int range buffer.length();int length 1;for (int i 0; i BIGDATALENGTH; i) {StringBuffer sb new StringBuffer();length random.nextInt(20)1;//System.out.println(length---length);for (int j 0; j length; j) {//System.out.println(j---j);sb.append(buffer.charAt(random.nextInt(range)));}System.out.println(sb----sb);writer.write(sb.toString() );}writer.close(); }   3.2 对大文件进行切割 /** } /*** 将原始数据分成几块 并排序 再保存到临时文件* throws IOException*/ public static void splitData() throws IOException {SuppressWarnings(resource)BufferedReader br new BufferedReader(new FileReader(ORIGINALPATH));tempFiles new File[BIGDATALENGTH / TEMPFILELENGTH];//将会产生的临时文件列表for (int i 0; i tempFiles.length; i) {tempFiles[i] new File(TEMPFILEPATH TempFile i .txt);BufferedWriter writer new BufferedWriter(new FileWriter(tempFiles[i]));HashMapInteger,String hashMap new HashMapInteger,String();//未排序//每次读出TEMPFILELENGTH个文件 保存到smallLine中for (int j 1; j TEMPFILELENGTH; j) {String text null;if ((text br.readLine()) ! null) {hashMap.put(j, text);}}hashMap MergeSort.sort(hashMap);for(int k1; kTEMPFILELENGTH; k){writer.write(String.valueOf(hashMap.get(k)) System.getProperty(line.separator)); //System.getProperty(line.separator)相当于}writer.close();} }   3.3 对小文件进行递归归并   /*** 多路归并排序* param files* throws IOException*/ public static void multiWaysMergeSort(String[] files) throws IOException {System.out.println(归并文件-----第 mergeSortCount 次-----);//当最后只有一个文件的时候 数据已经排序成功 直接复制保存到结果文件if (files.length 1) {String lastFilePath LASTFILEPATH LASTFILENAME;copyFile(files[0], lastFilePath, false);//deleteFile(files[0]);return;}for (int i 0; i files.length; i2) { //开始合并两个相邻的文件 所以一次跳两个if (i files.length - 1) { //这时候已经只剩下最后一个文件了 不需要合并 本趟归并结束renameFile(files[i], i);break;}//将br1 和 br2 写入到WriteBufferedReader br1 new BufferedReader(new FileReader(files[i]));BufferedReader br2 new BufferedReader(new FileReader(files[i 1]));BufferedWriter writer new BufferedWriter(new FileWriter(TEMPFILEPATH last_ mergeSortCount _ i .txt));String s1 br1.readLine();String s2 br2.readLine();while (s1 ! null || s2 ! null) {if (s1 ! null s2 ! null) { //都不为空 才有比较的必要int mergeResult s1.compareTo(s2);if (mergeResult 0) {//s1在s2后面writer.write(s2);writer.write(System.getProperty(line.separator));s2 br2.readLine();}if (mergeResult 0) {//s1s2writer.write(s1); writer.write(System.getProperty(line.separator));writer.write(s2); writer.write(System.getProperty(line.separator)); // System.out.println(write time : writeTime);s1 br1.readLine();s2 br2.readLine();}if (mergeResult 0) {//s1在s2前面writer.write(s1); writer.write(System.getProperty(line.separator));s1 br1.readLine();}}if (s1 null s2 ! null) {writer.write(s2);writer.write(System.getProperty(line.separator));s2 br2.readLine();}if (s2 null s1 ! null) {writer.write(s1);writer.write(System.getProperty(line.separator));s1 br1.readLine();}}br1.close();br2.close(); // deleteFile(files[i]); // deleteFile(files[i 1]);writer.close();}mergeSortCount;multiWaysMergeSort(getTempFiles(last_ (mergeSortCount-1) _)); }   3.4 运行结果分析 ①生成10亿个随机字符串时间太久了字符串长度随机在[1,20]之间时文件大小大概在10.7 GB (11,500,161,591 字节) ② 切割成小文件小文件内归并排序每个文件内的数据100万条时随机选取五个排序时间如下 一共发生了410832612 次对比一共发生了 899862656 次交换执行时间为3545毫秒 一共发生了429506513 次对比一共发生了 940765504 次交换执行时间为3512毫秒 一共发生了448181315 次对比一共发生了 981668352 次交换执行时间为3497毫秒 一共发生了466856137 次对比一共发生了 1022571200 次交换执行时间为3497毫秒 一共发生了485530473 次对比一共发生了 1063474048 次交换执行时间为3981毫秒 总共1000个文件切割耗时为 切割小文件所用时间---4341734ms---4341.734s---72.36m---1.206h ③  小文件递归归并1000个文件 共发生了10次归并 产生临时文件总共1999个 总大小为127.8 GB (137,201,789,278 字节) 产生结果文件11.6 GB (12,500,161,591 字节) 比源文件多了10亿个字节...... 总耗时为---7374129ms---7374.129s---122.9m---2.048h 不得不提的是最后执行结果成功也不枉我苦苦等待 四、相关技术 4.1 归并排序 排序原理不多介绍各种到处都有如果一时不记得看下面的原理图。秒懂。    4.2 文件读写 本程序很重要的一点就是对于文件的读写Buffer的文件读写可以很大程度的改善速率 写操作 BufferedWriter writer  new BufferedWriter(new FileWriter(PATH)); writer.write(hhf ); 读操作 BufferedReader br  new BufferedReader(new FileReader(PATH)); text  br.readLine()   五、关于优化 5.1分小文件时优化 前提数据均匀保证每个小文件大小不会超过内存的容量 处理在分数据到小文件时按字符串按首字母将其分到指定文件中如A-C分配到1.txtD-F分配到2.txt....... 优点只需要小文件内数据排序排序号后即可将1.txt、2.txt、3.txt直接连接起来极大的缩短了归并时间相当于把递归归并变成了文件连接而已 缺点前提不是很容易把握若有一个小文件内的数据量大于内存的大小则排序失败存在一定的风险 5.2小文件内排序时优化 前提保证每个小文件内数据量比较不是特别的大 处理将小文件内的数据进行快速排序 优点快排的时间效率是高于归并的 以下是测试数据 排序数量级  101000100000 归并排序7ms71ms3331ms 快速排序6ms52msjava.lang.StackOverflowError 缺点缺点已经显示在测试数据内了小文件内的数据量过大就可能导致当前线程的栈满 原文链接 更多文章 转载于:https://www.cnblogs.com/gyjWEB/p/5035763.html
http://wiki.neutronadmin.com/news/124056/

相关文章:

  • 激励案例网站制作甘德网站建设
  • 杭州高端网站建设商务网站业务流程
  • 零壹网站建设如何选择一个优质网站建设公司
  • 企业网站缺点有没有wordpress上的论坛
  • 网站后台风格校园品牌推广方案
  • 开发公司绩效考核评分细则seo推广手段
  • 天津网站建设方案做体育赛事网站公司
  • 青海中小企业网站建设网站开发的各个阶段及其完成的任务
  • 深圳网站设计+建设首选wordpress the post
  • 上海松江网站设计公司青岛公司网站建设开发
  • 织梦网站程序下载ps个人网站怎么做
  • 网站营销建设策划案58同城广告推广电话
  • 中国广东手机网站建设wordpress页面半透明
  • 重庆网站运营我做推广找不到我的网站
  • 商城网站建设步骤活动拍摄
  • app建设网站公司简介网站图表怎么做的
  • 新手建站教程视频河北网站开发网站
  • 浙江建设信息港网站查询Wordpress付费置顶
  • 泉州设计网站做ppt兼职的网站有哪些
  • 专业做相册书的网站网站建设方为客户提供使用说明书
  • 网站代理被抓建站之星收费版
  • 深圳网站制作公司兴田德润官方网站上海做网站最专业
  • 企业的外币收入外管局网站做啥免认证域名
  • 电商主图设计网站电商运营新手要懂哪些
  • 描写做网站专业的句子优秀网格员推荐表范文
  • 网站代维护做的比较好的医院网站
  • 如何查询网站的域名注册企业培训机构
  • 豆瓣网站模板wordpress 引号被转义
  • 阳春网站开发2022年互联网创业项目
  • 深圳做h5网站做网站环境配置遇到的问题