论坛首页 Java企业应用论坛

这不是面试题,这是真事

浏览 39065 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-07-25  
BitSet代替set
0 请登录后投票
   发表时间:2013-07-26  
iceman1952 写道
aochant 写道
分文件这么分
将第二列的整数 算出hashcode然后取摸,将这个结果一致的分到同一个文件中

这样保证了 第二列值一样的一定分在同一个文件

然后就很简单了
比如要分为20个小文件
“123123123”.hashCode()&0x7FFFFFFF%20

都不用这么麻烦的,每个整数对 20 求余 就OK啦。但是,其实我没必要这么搞的,就像我红色标注的那样,只要得到“那个整数出现过2次以上”我就足以。无用功作的越少越好

这个思路就很好了,不过可以做以下改进(其实这个方案已经很简单了,毕竟是50G的文件,不知道还要多简单 ):
1、直接内存映射文件读取整个大文件进行取模运算。
2、结果也不用重新写到新文件中,写文件是最耗时的,直接在内存里计算就可以了。
3、分多趟扫描文件取模,比如第一趟处理模数为1的整数,第二趟处理模数为2的整数。
0 请登录后投票
   发表时间:2013-07-26   最后修改:2013-07-26
,,先说问题,,
第一,需求不是很明确。

   我的建议;
           1,合理使用多线程,组织好线程之间工作协调问题。
           2,既然只需要获得重复,那么建议。使用最原始和直接,简单的技术。
0 请登录后投票
   发表时间:2013-07-26   最后修改:2013-07-31
用线程池+同步队列,算法就是拆分文件。。。队列就是保存待处理的文件及其状态大小。。。有两类线程,一类是拆分文件(就是根据数字来分,比如可以分100个文件,根据数字字符串前两位,如果文件还是挺大,可以继续分,提取数字字符串并保存到文件),一类是获取大小合适并已经拆分好的文件,然后统计出现次数大于等于二的并保存结果(可以保存到文件,并在在结果集中标明文件名,方便以后整合)。。。最后,任务都处理完的时候,就可以把结果集整合到一个文件中。。。线程池可以控制拆分和整合的线程数量。。。
我自己实现了一下,大概差不多40分钟左右吧。。。现在主要是在内存这块,我监测我的jvm用的内存在1g以下,64位cpu,双核。
0 请登录后投票
   发表时间:2013-07-26  
试试用位图数据结构试试呢
0 请登录后投票
   发表时间:2013-07-26  
chinaagan 写道
用线程池+同步队列,算法就是拆分文件。。。队列就是保存待处理的文件及其状态大小。。。有两类线程,一类是拆分文件(就是根据数字来分,比如可以分100个文件,根据数字字符串前两位,如果文件还是挺大,可以继续分,提取数字字符串并保存到文件),一类是获取大小合适并已经拆分好的文件,然后统计出现次数大于等于二的并保存结果(可以保存到文件,并在在结果集中标明文件名,方便以后整合)。。。最后,任务都处理完的时候,就可以把结果集整合到一个文件中。。。线程池可以控制拆分和整合的线程数量。

因为io占用时间比较多,可以批量读取,批量写入。
0 请登录后投票
   发表时间:2013-07-26  
你可以试一下bloomfilter这个
在添加之前先判断是否存在,如果存在就是>=2次了

当然bloomfilter有错误率,如果你不允许错误率的话,就不要使用了
1 请登录后投票
   发表时间:2013-07-26  
shell没试过,hehuabing的方式肯定是可行的,这个是最方便的办法了,效率也非常高,相信可以超过shell。
看看编程珠玑吧
hehuabing 写道
试试用位图数据结构试试呢
0 请登录后投票
   发表时间:2013-07-26  
对于第二列是整数的情况,可以使用位图。
每读一行数据就使用位图进行判断,超过出现2次就将此行写到另一个文件中。
读取文件时可以使用fileChannel等高级读取工具,避免将文件一次读到内存里。
0 请登录后投票
   发表时间:2013-07-26  
就是它的那列整数有15位呢,都超过long最多值了 这个比较蛋疼啊 要用几个数组来切分
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics