首页 > 系统相关 >给定一个10GB大小的文件,存储的都是数字,如何对文件中的数字进行排序,并输出新文件?限制内存只有1GB

给定一个10GB大小的文件,存储的都是数字,如何对文件中的数字进行排序,并输出新文件?限制内存只有1GB

时间:2024-08-09 18:05:28浏览次数:15  
标签:文件 归并 数字 buffer 10GB 内存 排序

背景

这是一道面试题,可考察的点也不少。总结几个关键词去解决这个问题,1,文件拆分;2、排序算法;3、缓冲buffer性能优化。
啊,乍一看,这绝对不是一个初级程序员能够答出来,且能答得很好的问题,这个题目可以考察到我们的算法能力,性能优化经验。可万万不能马虎对待!
开始讲思路。第一步,

文件拆分

首先外部输入的文件,如果不出意外的话大文件,我们都不建议一次性地将其加载到我们的内存中,内存可是很宝贵的,它还要干其他很多很多的事情。不能因为一个文件的导入,而让内存陷入卡顿的危机。所以,针对这种大文件,我们首先就是给他做个拆分,即批量处理嘛,因为本质是给数字进行排序,那我就将这个大文件拆分为15个小文件。
然后依次将这些文件加载到内存中,经过我们的排序算法(可以是快速排序,堆排序,归并排序,等,当然你非要用冒泡我觉得也可以,不过大家应该还是比较喜欢快一点的排序算法), 输出一个新的有序文件。这样一通操作下来,我们就有个15个新的已经是有序的文件了。但是,我们最终需要输出一个大文件,大小还是10GB的有序文件。
所以,来到第二步。

多路归并

多路归并的意思就是说,将这个几个有序的文件中的数字,全部归在一起,做一个整体的排序。然后输出一个有序的大文件。
想必大家也听说过归并排序。那这里可以直接拿来用吗?不好意思,用不了。归并是针对两个数组,每次拿出数组中的两个元素进行比较,那如果是三个数组的话,不就不好比较了。
有一种办法是先取出两个文件进行二路归并,然后再将输出的有序文件和第三个无序文件进行归并,这样我们归并到后面,数字越来越多,有占满内存的风险。
本博文将讨论一种比较好的多路归并办法,也是通用的技术,就是使用堆排序。
针对15个有序文件,先新建一个最小堆,然后取这个15个文件中的第一个元素进行初始化。一定要一层一层取,这样不会乱序。

堆内会自动排序,最小堆的堆顶放置的是最小的元素。
然后,取出堆顶元素,使用一个数据结构list存放起来。接着,我们依次处理剩余文件中的数字,遍历15个文件,每次从文件中取出一个数字,放入堆中,此时堆内自动排序,就会将最小元素放置在堆顶, 我们移除堆顶元素放入list中。这样子,一个一个处理,最终遍历结束以后,List 中就会得到一个有序的数字集合。
最终我们将List中的数字输出到文件持久化存储就好了。
关于堆排序的过程,可以见其他博客。

性能优化

仔细看多路归并这个过程,发现list存储10GB的数字会不会有点太大了呢?而且,每次从文件中取数字,一层一层取,A文件第二个,B文件第二个,C文件第二个....A文件第三个,B文件第三个,C文件第三个, 这样与磁盘的交互是不是有点太频繁了。这个时候,考虑使用缓冲区优化吧,不然太消耗IO了。
放大招,使用Buffer。由于我们处理的是整型数字,所以可选择IntBuffer,容量可设置为8KB,这个根据需要处理的数据量来定。
这样,多路归并的过程就可以是,遍历文件,每次从各个文件中取出一个元素,放入buffer。取个几层以后,buffer要满了,我们再将buffer中的数据拿去做堆排序。
然后清空buffer, 继续遍历文件,取元素,重复以上过程。
同样的,对于List中这个数据结构,我们也使用一个输出buffer去接收已排序的元素。等buffer满了,将数据flush到输出文件中。
以上就是这个问题的整体思路啦。还有什么要补充的, 欢迎打在评论区。

标签:文件,归并,数字,buffer,10GB,内存,排序
From: https://www.cnblogs.com/xyuanzi/p/18351052

相关文章

  • 万字长文讲透数字化转型
    温馨提醒:1.6w字详细拆解,内容篇幅较长,建议先收藏~数字化浪潮正在席卷全球,践行数字化转型和提升企业的运营水平与竞争力,已经成为各国企业角力全球市场的重要议题。为此,很多国家政府都推出了鼓励和推动本国企业数字化转型的相关政策。在国内,旧的增长方式难以为继,企业面临迫切的......
  • 《永劫无间》游戏崩溃提示缺少steam_api.dll文件怎么处理?永劫无间游戏弹窗“找不到ste
    在玩《永劫无间》时,如果遇到游戏崩溃并提示缺少steam_api.dll文件,这是一个常见的问题。可以尝试重新安装Steam平台,或者从可靠渠道获取该文件并放置到正确的游戏目录下,以恢复游戏的正常运行。本篇将为大家带来《永劫无间》游戏崩溃提示缺少steam_api.dll文件修复方法的内容,感兴......
  • 《英雄联盟》游戏闪退提示“base.dll文件损坏”怎么修复?英雄联盟游戏崩溃弹窗base.dll
    在《英雄联盟》遇到因“base.dll文件损坏”而导致的游戏闪退问题时,可以先尝试重新安装游戏,这能覆盖可能损坏的文件。还可以使用系统的文件修复工具,对该文件进行检测和修复,或者从可靠来源获取该文件进行替换。本篇将为大家带来《英雄联盟》游戏闪退提示“base.dll文件损坏”修复......
  • 电脑弹窗“找不到libmmd.dll文件”怎么处理?Win11系统缺少libmmd.dll文件的修复方法一
    当电脑弹窗提示“找不到libmmd.dll文件”时,有几种可行的修复方法。可以在网上搜索该文件并下载,将其放置到正确的系统目录中。也可以通过运行系统文件检查工具,对缺失的文件进行扫描和修复,恢复系统的正常运行。本篇将为大家带来电脑弹窗“找不到libmmd.dll文件”的内容,感兴趣的小......
  • 易捷OA协同办公系统 ShowPic接口任意文件读取漏洞复现 [附POC]
    文章目录易捷OA协同办公系统ShowPic接口任意文件读取漏洞复现[附POC]0x01前言0x02漏洞描述0x03影响版本0x04漏洞环境0x05漏洞复现1.访问漏洞环境2.构造POC3.复现易捷OA协同办公系统ShowPic接口任意文件读取漏洞复现[附POC]0x01前言免责......
  • 外发文件怎么控制?(怎么禁止文件外发)这九种禁止文件外发的技巧,学到了!
    文件外发管理是一项至关重要的任务。不当的文件外发可能导致敏感信息泄露,给企业带来重大损失。因此,掌握如何有效禁止非授权文件传播,是每个企业都需要掌握的技能。以下九大技巧,将帮助你实现这一目标。1.强化政策与流程首先,明确并强化公司的文件外发政策与流程。确保每位......
  • 数字样机:惯性导航系统控制单元仿真
    01.简介惯性导航系统 (INS,InertialNavigationSystem)基于惯性原理建立,而惯性是物体自身的固有属性,因此其工作时既不依赖于外部信息,也不向外部辐射能量,优于卫星导航与无线电导航,是一种具备隐蔽性、自主性的导航系统,被广泛应用于航空航天、无人机、智能交通等各类领域中,是复杂......
  • 常见文件下载相关的方法
    //导出操作相关的方法//数据导出功能asyncfunctiondownloadData(httpUrl,params,fileName,type="application/vnd.ms-excel"){console.log("数据导出中……");constdata=awaithttpUrl(params);constfileTypeList=["application/vnd.ms-excel&q......
  • 如何从一堆文件中找到指定的日志段?
    背景这个问题主要考察了Linux命令的使用,find命令和grep命令,在linux系统中,这两个命令用的比较广泛,工作中常常可以用来查找到指定的日志内容。今天我们就来学一下两个命令,然后回答下这个问题吧。命令介绍1、find命令find常用来在Linux系统中查找文件或者目录,查找到的文件名会......
  • 按照第一列拆分excel为单独文件
    按照第一列拆分excel为单独文件创建时间:2024-08-09一、使用方法1.1修改config.json文件里面的地址{"excelPATH":"E:\\downloads\\无标题(2).xls"}修改为后面文件的具体位置1.2双击运行程序二、使用实例2.1数据准备2.2按照商品名称拆分将商品名称复制到第......