锁定老帖子 主题:这不是面试题,这是真事
精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-07-25
BitSet代替set
|
|
返回顶楼 | |
发表时间:2013-07-26
iceman1952 写道 aochant 写道 分文件这么分
将第二列的整数 算出hashcode然后取摸,将这个结果一致的分到同一个文件中 这样保证了 第二列值一样的一定分在同一个文件 然后就很简单了 比如要分为20个小文件 “123123123”.hashCode()&0x7FFFFFFF%20 都不用这么麻烦的,每个整数对 20 求余 就OK啦。但是,其实我没必要这么搞的,就像我红色标注的那样,只要得到“那个整数出现过2次以上”我就足以。无用功作的越少越好 这个思路就很好了,不过可以做以下改进(其实这个方案已经很简单了,毕竟是50G的文件,不知道还要多简单 ): 1、直接内存映射文件读取整个大文件进行取模运算。 2、结果也不用重新写到新文件中,写文件是最耗时的,直接在内存里计算就可以了。 3、分多趟扫描文件取模,比如第一趟处理模数为1的整数,第二趟处理模数为2的整数。 |
|
返回顶楼 | |
发表时间:2013-07-26
最后修改:2013-07-26
,,先说问题,,
第一,需求不是很明确。 我的建议; 1,合理使用多线程,组织好线程之间工作协调问题。 2,既然只需要获得重复,那么建议。使用最原始和直接,简单的技术。 |
|
返回顶楼 | |
发表时间:2013-07-26
最后修改:2013-07-31
用线程池+同步队列,算法就是拆分文件。。。队列就是保存待处理的文件及其状态大小。。。有两类线程,一类是拆分文件(就是根据数字来分,比如可以分100个文件,根据数字字符串前两位,如果文件还是挺大,可以继续分,提取数字字符串并保存到文件),一类是获取大小合适并已经拆分好的文件,然后统计出现次数大于等于二的并保存结果(可以保存到文件,并在在结果集中标明文件名,方便以后整合)。。。最后,任务都处理完的时候,就可以把结果集整合到一个文件中。。。线程池可以控制拆分和整合的线程数量。。。
我自己实现了一下,大概差不多40分钟左右吧。。。现在主要是在内存这块,我监测我的jvm用的内存在1g以下,64位cpu,双核。 |
|
返回顶楼 | |
发表时间:2013-07-26
试试用位图数据结构试试呢
|
|
返回顶楼 | |
发表时间:2013-07-26
chinaagan 写道 用线程池+同步队列,算法就是拆分文件。。。队列就是保存待处理的文件及其状态大小。。。有两类线程,一类是拆分文件(就是根据数字来分,比如可以分100个文件,根据数字字符串前两位,如果文件还是挺大,可以继续分,提取数字字符串并保存到文件),一类是获取大小合适并已经拆分好的文件,然后统计出现次数大于等于二的并保存结果(可以保存到文件,并在在结果集中标明文件名,方便以后整合)。。。最后,任务都处理完的时候,就可以把结果集整合到一个文件中。。。线程池可以控制拆分和整合的线程数量。
因为io占用时间比较多,可以批量读取,批量写入。 |
|
返回顶楼 | |
发表时间:2013-07-26
你可以试一下bloomfilter这个
在添加之前先判断是否存在,如果存在就是>=2次了 当然bloomfilter有错误率,如果你不允许错误率的话,就不要使用了 |
|
返回顶楼 | |
发表时间:2013-07-26
shell没试过,hehuabing的方式肯定是可行的,这个是最方便的办法了,效率也非常高,相信可以超过shell。
看看编程珠玑吧 hehuabing 写道 试试用位图数据结构试试呢
|
|
返回顶楼 | |
发表时间:2013-07-26
对于第二列是整数的情况,可以使用位图。
每读一行数据就使用位图进行判断,超过出现2次就将此行写到另一个文件中。 读取文件时可以使用fileChannel等高级读取工具,避免将文件一次读到内存里。 |
|
返回顶楼 | |
发表时间:2013-07-26
就是它的那列整数有15位呢,都超过long最多值了 这个比较蛋疼啊 要用几个数组来切分
|
|
返回顶楼 | |