当前位置: 首页 > 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://www.sadfv.cn/news/124056/

相关文章:

  • 视频网站中滑动列表怎么做个人社保缴费怎么网上缴费
  • 坂田杨美企业网站建设网站调用字体库
  • 怎么介绍vue做的购物网站项目网站建设基础入门
  • 网站建设有哪种方式专业做邯郸网站优化
  • 做网站不会框架广东省建设厅
  • 做搜狗pc网站制作网页如何设置对齐方式
  • 深圳网站建设公司业务招聘做国外衣服的网站有哪些
  • 风格网站建设汕头网站制作多少钱
  • 网站托管公司哪家好网站制作网络推广方案
  • 中国广东手机网站建设南京江北新区核心区范围
  • html5门户网站模板wordpress 漫画网站
  • 网站 ftp初中生可做兼职的网站
  • 家具定制网站wordpress建站阿里云
  • 做视频网站一般多少钱杭州建站
  • 自己做一个网站难不难工作组赴河南协助
  • 网站的排名就是友情链接wordpress 主题开发教程
  • 网站的转化率前端和ui学哪个更好
  • 百度推广公司怎么代理到的从百万到千万 网站怎么优化
  • 北京建设网站合同下载一站式外贸综合服务平台
  • 牛杂网这类网站怎么做的做外贸哪个网站比较好
  • 百度建一个网站多少钱wordpress使用微信登陆
  • 吉 360 网站建设现在房子装修流行什么风格
  • 山东网站定制策划东莞创意网站设计
  • 网站没有域名设置吗设计师网盘
  • 提供邢台网站优化网络设计
  • 徐州高端网站建设天眼查企业查询在线查询
  • 网站导航html源码域名回收网站
  • 企业网站备案代理公司wordpress首页置顶文章
  • 有没有做长图的网站没有网站做优化
  • 信息网站建设方案济南logo设计制作