各组老大酒后开了一个盘口,各自都扔钱到奖池,题目如下:
一个24G的TXT文件。
每行一个INT.MAX(2147483647?)的随机整数。
做排序。
运行环境是一台8G的MAC。
要求用纯JDK,不能借助第三方包。
哪个组的程序效率最高,哪个组就拿奖池里面的奖金!
我这里想到的一个办法就是
1. 假设分成10个外部文件,文件1存的是2亿内的数。文件2存的是2亿-4亿内的数
2. 多线程去读取这个24G文件.然后按照数字的区间分别写到那10个外部文件去
3. 对这10个外部文件单独做排序。然后做合并
当然实际中10个是不够的。这里是做个假设。
如果有更好的办法,请砸过来!拿奖了,我会发红包,谢谢!
楼主的思路不错,还有几点需要确认:
1.都是正整数吗?
2.CPU是几核的?
######都,都是正整数~CPU是8核的######多线程读大文件。。。。######理论上应该先估算数据规模,大概有多少个数,随机分布的话排序会产生大概怎样高度的树
需要在内存里维护多大的数据量
尽量只读一遍文件和少写临时文件少合并临时文件减少IO
######所以你的方案是?######百度的题目吗 先分配空间:INT.MAX字节 四个文件
读取的数字直接 按顺序 写入位置:(num-1) *4 ,最好缓存一下 ,分批写入
第一想法
nio+fork/join
。。。
后面慢慢想
######硬件有限制,这样做交换的方法肯定没错,时间耗费就在读写文件上了,我建议用多线程读文件randomaccessfile每个线程只读取一部分(例如1-10,10-20其中一个线程就直接从10开始读取),然后每个线程里都对应文件有集合,当集合达到一定数量,或者文件读取完时开始写文件(写文件的时候要加锁,肯定不能读取一个就写一个),这样文件就先分完成,由于分小的文件都不会太大,可以用nio直接读取到内存,然后用快速排序做排序,最后写文件######归并排序?###### 关键问题:奖金多少?如果帮你拿奖了,怎么分配?版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。