Java 超大文件统计

2018-06-11 10:39:16 +08:00
 MrXiong

对于超大文件也就是无法一次性加载到内存,行数据是 key:value,统计同一个,key 的不同 value 个数,并输出到文件,格式为 key:n,输出的文件假设也很大,也无法加载到内存中,求思路

6569 次点击
所在节点    Java
38 条回复
rockyou12
2018-06-11 12:50:10 +08:00
lz 怕是从来没写过 java 的文件操作,如果直接用 stream 来读,本来就该用个小的 buffer 来读。不然直接用 nio 的 readline 就行了。自己谷歌下 java nio read file
CoderGeek
2018-06-11 12:55:49 +08:00
...一行一行就好了
EchoUtopia
2018-06-11 12:57:22 +08:00
@wplct #18 文件上 gb 量级不代表前缀树也有这么大。。
wplct
2018-06-11 12:59:48 +08:00
楼上的,楼主不是流式处理 ,是因为这个需求需要去重,一次性处理内存可能不够
panpanpan
2018-06-11 13:14:35 +08:00
导进数据库里面 group by 一下难道不是最简单的方式?
MrXiong
2018-06-11 13:20:00 +08:00
@panpanpan 这是公司的转正题目,使用数据库是不是不太好啊
xmh51
2018-06-11 13:21:15 +08:00
分而治之 把大文件拆分掉成 N 份 每份都计算 key 的 value count 值(需要带上 value ),然后把 key 按 hashcode 计算得到文件里面。最后合并结果文件
xmh51
2018-06-11 13:21:57 +08:00
感觉像算法题 果然是算法题 ......
xmh51
2018-06-11 13:24:36 +08:00
优化下 分而治之 读大文件不用拆分,一行一行读即可,直接计算 hashcode,把 key value 直接放到 N 份文件中的指定一个文件中。然后直接计算结果,最后合并结果
MrXiong
2018-06-11 13:27:31 +08:00
@xmh51 你的意思是每个 hash 一个文件吗,并且你忘记去重了
verrickt
2018-06-11 13:29:31 +08:00
先对文件用外部排序按 key 排序。然后读一行,看下一行的 key,一样的话加计数,不一样把计数写到输出文件里。大体上还是外部排序+归并的思路
xmh51
2018-06-11 13:42:58 +08:00
@MrXiong 去重在 hash 之后的一个步骤。一共两次 第一次 归并 key value 到指定文档,第二次 去重计算 count
xmh51
2018-06-11 13:46:19 +08:00
@MrXiong 第一次 归并 key value 到指定的 n 个文件中(保证 key 相同的数据在同一个文件中,可以用 hashcode 分),第二次 去重计算 count,最好合并结果
20015jjw
2018-06-11 14:00:39 +08:00
data base 课最基本的内容吧
dangluren
2018-06-11 14:27:04 +08:00
你好,这种问题,就和 mapreduce 类似了。如果你不用 mapreduce,可以这样做(其实也是 mapreduce 的原理)
假如数据有 10G,你内存 1G, 假设比较均匀,不存在数据倾斜情况(倾斜不能太严重)。
1. 你先一行一行的读取,然后得到 key 的 hashcode, 然后对%20,得到的数是几,就写到第几个文件去。
2. 由第一步你就得到了 20 个文件了,如果数据没倾斜,大概一个就 500M, 这时候同一个 key 的肯定在同一个文件,进行处理就可以了。
3. 如果有点数据倾斜,就%30, %50 的尝试。如果某一个 key 就超过了 1G,某个 key 很大的情况下,你可以先把这个 key 过滤出来,写入到一个文件中,然后再使用布隆过滤器或者其他什么方法
kaiser1992
2018-06-11 15:11:48 +08:00
采用分治思想,借助 Hadoop
qingfengxm
2018-06-11 15:11:53 +08:00
不知道你说的超大文件有多大? 10G 还是 10T。你这说的其实就是大数据单词计数,mapreduce 或者 spark 搞定
dif
2018-06-14 19:14:13 +08:00
mapreduce

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/462083

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX