论坛首页 Java企业应用论坛

这不是面试题,这是真事

浏览 39061 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-07-25   最后修改:2013-07-25
我有一个文件,一共100列,每个列以 tab 分开,第二列是一个 15位 的整数(此列是乱序的)
文件行数在2亿行之内,文件很大,大约 50G 左右。现在要求我找出 满足这种条件的行:第二列的整数,在此文件中,出现过2次或2次以上

有啥好办法嘛?
我现在这么搞的:将文件尽量分成小文件(保证同样的数字分到同一个小文件中),使得此文件可以整个load到内存中。然后对内存中的数据使用set看是否曾经重复出现过
根据最后一位的值(0, 1, ..., 9),分成10个child文件。如果某个child文件还大于512M(我JVM内存比512大一点点,可以load整个文件),在根据第二位再分割此child文件,得到 grandchild文件;如果grandchild文件还是大于512M,则根据第三位分割......


缺点:太耗时,以至于不现实,要1个多小时

PS:我将 JVM 最大heap设为 1024M,然后,测试将Long加入到set中,发现,可以创建 1700W个Long对象(Integer对象也是这么多)。到production环境中,我估计heap可以设置到8G,但是,即使这样,也只有1.6亿的Long(或者Integer),所以,肯定还是不能够读入所有的 整数,然后使用set判断哪个曾经出现过2次或2次以上

各位,有好办法嘛?我只要知道哪些整数曾经出现过2次或2次以上即可(分不分文件、出现的确切次数 我都不在乎)

另外:不要建议分布式啥的,这个也用不起来,我这就是一个 standalone 的应用
   发表时间:2013-07-25  
分文件这么分
将第二列的整数 算出hashcode然后取摸,将这个结果一致的分到同一个文件中

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

然后就很简单了
比如要分为20个小文件
“123123123”.hashCode()&0x7FFFFFFF%20
0 请登录后投票
   发表时间:2013-07-25  
一个节点不够,就多个节点呗。与其在算法上纠结,不如在架构上扩展:)
例如,JVM内存不够载入所有数字,就搞4台memcached帮你存~
0 请登录后投票
   发表时间:2013-07-25  
一条shell命令足够
awk -F "\t" '{print $2| "sort -n | uniq -d" }' FILE
0 请登录后投票
   发表时间:2013-07-25  
aochant 写道
分文件这么分
将第二列的整数 算出hashcode然后取摸,将这个结果一致的分到同一个文件中

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

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

都不用这么麻烦的,每个整数对 20 求余 就OK啦。但是,其实我没必要这么搞的,就像我红色标注的那样,只要得到“那个整数出现过2次以上”我就足以。无用功作的越少越好
0 请登录后投票
   发表时间:2013-07-25  
pudgy 写道
一条shell命令足够
awk -F "\t" '{print $2| "sort -n | uniq -d" }' FILE

50G的文件,你确定这么能行?事实上,我是一个 standalone 的程序,尽量要减少第三方依赖
0 请登录后投票
   发表时间:2013-07-25   最后修改:2013-07-25
2亿行,即2亿个长整型。 2亿×8字节 = 1.6G。

理论上做好算法,你只需要 2个G的内存就可以搞定了,呵呵。
(不要用对象,用长整型数组)
0 请登录后投票
   发表时间:2013-07-25  
iceman1952 写道
pudgy 写道
一条shell命令足够
awk -F "\t" '{print $2| "sort -n | uniq -d" }' FILE

50G的文件,你确定这么能行?事实上,我是一个 standalone 的程序,尽量要减少第三方依赖

my 上帝 ,why 要搞这么大滴文件?就不能再做这个文件的时候分小点,从源头解决嘛,掐死在襁褓中
0 请登录后投票
   发表时间:2013-07-25  
alvin198761 写道
iceman1952 写道
pudgy 写道
一条shell命令足够
awk -F "\t" '{print $2| "sort -n | uniq -d" }' FILE

50G的文件,你确定这么能行?事实上,我是一个 standalone 的程序,尽量要减少第三方依赖

my 上帝 ,why 要搞这么大滴文件?就不能再做这个文件的时候分小点,从源头解决嘛,掐死在襁褓中

国际漫游,数据量非常大。这是运营商提供的数据,我们不能控制
0 请登录后投票
   发表时间:2013-07-25   最后修改:2013-07-25
shell命令很高效的,50G分分钟的事,估计10分钟最多了。
内存也不是问题,最多4G就够了。
0 请登录后投票
论坛首页 Java企业应用版

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