开发者社区> 问答> 正文

大文件做排序,你有高招?:报错

各组老大酒后开了一个盘口,各自都扔钱到奖池,题目如下:


一个24G的TXT文件。


每行一个INT.MAX(2147483647?)的随机整数。


做排序。


运行环境是一台8G的MAC。


要求用纯JDK,不能借助第三方包。


哪个组的程序效率最高,哪个组就拿奖池里面的奖金!


我这里想到的一个办法就是


1. 假设分成10个外部文件,文件1存的是2亿内的数。文件2存的是2亿-4亿内的数


2. 多线程去读取这个24G文件.然后按照数字的区间分别写到那10个外部文件去


3. 对这10个外部文件单独做排序。然后做合并


当然实际中10个是不够的。这里是做个假设。


如果有更好的办法,请砸过来!拿奖了,我会发红包,谢谢!














展开
收起
kun坤 2020-06-08 10:57:43 411 0
1 条回答
写回答
取消 提交回答
  • 楼主的思路不错,还有几点需要确认:

    1.都是正整数吗?

    2.CPU是几核的?

    ######都,都是正整数~CPU是8核的######多线程读大文件。。。。######

    理论上应该先估算数据规模,大概有多少个数,随机分布的话排序会产生大概怎样高度的树

    需要在内存里维护多大的数据量

    尽量只读一遍文件和少写临时文件少合并临时文件减少IO

    ######所以你的方案是?######百度的题目吗

    先分配空间:INT.MAX字节 四个文件
    读取的数字直接 按顺序 写入位置:(num-1) *4 ,最好缓存一下 ,分批写入

    ######回复 @rockingMan : 重复的情况,字节数应该加大一些######回复 @samtribiani : 额 好像还真是一样的 我以前看过类似的###### @rockingMan 那你这个和我那个方案是一样的?######回复 @samtribiani : 也可以分几个文件,输出的文件有什么格式要求吗######不是百度。是公司高管出的。你的方案是只需要4个文件吗######mapreduce######楼主的思路也是类mapreduce模型。######纯JDK######hive######纯Java######

    第一想法

    nio+fork/join


    。。。

    后面慢慢想

    ######硬件有限制,这样做交换的方法肯定没错,时间耗费就在读写文件上了,我建议用多线程读文件randomaccessfile每个线程只读取一部分(例如1-10,10-20其中一个线程就直接从10开始读取),然后每个线程里都对应文件有集合,当集合达到一定数量,或者文件读取完时开始写文件(写文件的时候要加锁,肯定不能读取一个就写一个),这样文件就先分完成,由于分小的文件都不会太大,可以用nio直接读取到内存,然后用快速排序做排序,最后写文件######归并排序?###### 关键问题:奖金多少?如果帮你拿奖了,怎么分配?
    2020-06-08 17:58:31
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载