锁定老帖子 主题:这不是面试题,这是真事
精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-07-25
最后修改:2013-07-25
文件行数在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 的应用 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2013-07-25
分文件这么分
将第二列的整数 算出hashcode然后取摸,将这个结果一致的分到同一个文件中 这样保证了 第二列值一样的一定分在同一个文件 然后就很简单了 比如要分为20个小文件 “123123123”.hashCode()&0x7FFFFFFF%20 |
|
返回顶楼 | |
发表时间:2013-07-25
一个节点不够,就多个节点呗。与其在算法上纠结,不如在架构上扩展:)
例如,JVM内存不够载入所有数字,就搞4台memcached帮你存~ |
|
返回顶楼 | |
发表时间:2013-07-25
一条shell命令足够
awk -F "\t" '{print $2| "sort -n | uniq -d" }' FILE |
|
返回顶楼 | |
发表时间:2013-07-25
aochant 写道 分文件这么分
将第二列的整数 算出hashcode然后取摸,将这个结果一致的分到同一个文件中 这样保证了 第二列值一样的一定分在同一个文件 然后就很简单了 比如要分为20个小文件 “123123123”.hashCode()&0x7FFFFFFF%20 都不用这么麻烦的,每个整数对 20 求余 就OK啦。但是,其实我没必要这么搞的,就像我红色标注的那样,只要得到“那个整数出现过2次以上”我就足以。无用功作的越少越好 |
|
返回顶楼 | |
发表时间:2013-07-25
pudgy 写道 一条shell命令足够
awk -F "\t" '{print $2| "sort -n | uniq -d" }' FILE 50G的文件,你确定这么能行?事实上,我是一个 standalone 的程序,尽量要减少第三方依赖 |
|
返回顶楼 | |
发表时间:2013-07-25
最后修改:2013-07-25
2亿行,即2亿个长整型。 2亿×8字节 = 1.6G。
理论上做好算法,你只需要 2个G的内存就可以搞定了,呵呵。 (不要用对象,用长整型数组) |
|
返回顶楼 | |
发表时间:2013-07-25
iceman1952 写道 pudgy 写道 一条shell命令足够
awk -F "\t" '{print $2| "sort -n | uniq -d" }' FILE 50G的文件,你确定这么能行?事实上,我是一个 standalone 的程序,尽量要减少第三方依赖 my 上帝 ,why 要搞这么大滴文件?就不能再做这个文件的时候分小点,从源头解决嘛,掐死在襁褓中 |
|
返回顶楼 | |
发表时间:2013-07-25
alvin198761 写道 iceman1952 写道 pudgy 写道 一条shell命令足够
awk -F "\t" '{print $2| "sort -n | uniq -d" }' FILE 50G的文件,你确定这么能行?事实上,我是一个 standalone 的程序,尽量要减少第三方依赖 my 上帝 ,why 要搞这么大滴文件?就不能再做这个文件的时候分小点,从源头解决嘛,掐死在襁褓中 国际漫游,数据量非常大。这是运营商提供的数据,我们不能控制 |
|
返回顶楼 | |
发表时间:2013-07-25
最后修改:2013-07-25
shell命令很高效的,50G分分钟的事,估计10分钟最多了。
内存也不是问题,最多4G就够了。 |
|
返回顶楼 | |