热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

对有5亿整数的大文件排序

一、需求有1个大文件包含5亿个数(文件大小好几个G),其中每一行都是一个随机整数(不重复),现

一、需求

有1个大文件包含5亿个数(文件大小好几个G),其中每一行都是一个随机整数(不重复),现在要对这个文件进行排序。


二、实现

2.1 位图法

核心思想是,创建一个拥有5亿bits的BitSet(位图),BitSet每一位初始时都为false。然后读取包含正整数的文件,对于每一个数i,将bitSet[i]设置为true。最后遍历位图,如果bitSet[j]为true,那么输出 j。

采用位图法,也可以判断某个给定的数是否在大文件中,只需要判断bitSet的指定位是否为true即可。

下面是我写的一个简单的demo,用于对文件中的数字排序:

data.txt内容如下:

代码如下:

public static void main(String[] args) {BitSet bitSet = new BitSet(100);try (BufferedReader br = new BufferedReader(new FileReader("F:\\data.txt"))) {String line = null;while ((line = br.readLine()) != null) {int value = Integer.valueOf(line);bitSet.set(value);}} catch (Exception e) {e.printStackTrace();}for (int i = 0; i

结果如下:

1
7
9
12
32
43
87
765
32543

2.2 外部排序

在内存极小的情况下,采用分治策略,利用外存保存中间结果,再用多路归并来排序。

map-reduce思想:

内存中维护一个极小的缓冲区buffer,将大文件bigdata按行读入,直到buffer满或者大文件读完时,对buffer中的数据调用内排进行排序,排序后将有序结果写入磁盘临时文件bigdata.xxx.part.sorted,循环利用buffer直到大文件处理完毕,得到n个有序的临时文件。

接下来,对n个有序的临时文件进行归并排序,方法如下:假如有三个临时文件,其中文件1:3,6,9,文件2:2,4,8,文件3:1,5,7。

第一回合:文件1的最小值:3 , 排在文件1的第1行,文件2的最小值:2,排在文件2的第1行,文件3的最小值:1,排在文件3的第1行 那么,这3个文件中的最小值是:min(1,2,3) =1。也就是说,最终大文件的当前最小值,是文件1、2、3的当前最小值的最小值。上面拿出了最小值1,写入大文件。

第二回合:文件1的最小值:3,排在文件1的第1行,文件2的最小值:2,排在文件2的第1行,文件3的最小值:5,排在文件3的第2行。那么,这3个文件中的最小值是:min(5,2,3) = 2,将2写入大文件。

接下来,重复上述操作,直到所有小文件的内容都写到了大文件。

 

参考:

https://blog.csdn.net/zxx901221/article/details/83028481

https://mp.weixin.qq.com/s?__biz=MzUzMTA2NTU2Ng==&mid=2247488950&idx=2&sn=a3f4a09acd07638055c803338c15e29e&chksm=fa496a07cd3ee3117a27f17818ddc4152a817b50961780ae65ce3ac545303092221b08778e16&mpshare=1&scene=1&srcid=&sharer_sharetime=1582344585643&sharer_shareid=cfcd208495d565ef66e7dff9f98764da&key=56dae8b8a643d0f33cf6fdae6748f10f94d93459951fc0f564b244e54c6e8de6cce77ff794210f989a83231ae733a61f773233f7a4f5cbe90fac0ba3b3f194898dacea95b4b6667befc1c49ea94fd347&ascene=1&uin=MjI5NzkwNjI0Mg%3D%3D&devicetype=Windows+10&version=62070158&lang=zh_CN&exportkey=A9Ay4nz6HZO2bU0iugefePI%3D&pass_ticket=FW9GJdVHO2LjxiXcRXeofaBYJdcXuPY6k3di%2BzwOyVBLknE63w20ogQQfIUitcCY


推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
author-avatar
清雅竹gf_644
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有