Java 超大文件统计

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

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

6561 次点击
所在节点    Java
38 条回复
zynlp
2018-06-11 10:46:02 +08:00
这种活就交给 python 吧
MrXiong
2018-06-11 10:46:47 +08:00
@zynlp 语言其次的,思路是关键
araraloren
2018-06-11 10:47:57 +08:00
思路不就是读多少处理多少么。。
huiyadanli
2018-06-11 10:48:14 +08:00
把超大文件处理到数据库中,然后用 sql 统计数据
wplct
2018-06-11 10:48:20 +08:00
java 不是可以按行读取么
wplct
2018-06-11 10:51:20 +08:00
要不,先跑一边计数每个 key 有多少个 value,然后一个个 key 分开处理,慢是慢些
xylophone21
2018-06-11 10:59:16 +08:00
超大是多大?目的是什么?(考试还是工程)
如果是工程问题,最简单的方法其实是转嫁矛盾,读一行,写一条数据到文件行不行?文件不好查找,直接用数据库行不行?数据库还不够,分表行不行?分表还不行,用跟牛 X 的数据库分表啊。
如果是考试,那就往 hadoop 生态,MapReduce 上扯。
MrXiong
2018-06-11 11:01:04 +08:00
@xylophone21 直接上 MapReduce 进行处理?
EchoUtopia
2018-06-11 11:01:53 +08:00
postgres:
insert into words_count(word) values('example') on conflict do update count=words_count.count + 1 returning id
wplct
2018-06-11 11:02:12 +08:00
all_key = {}
with open('f.text') as f:
key = f.readline().split(':')[0]
if key not in all_key:
all_key[key] = 0
all_key[key] += 1

result = {}

for key in all_key.keys():
values = set()
with open('f.text') as f:
key, value = f.readline().split(':')
if key == key:
values.add(value)
result[key] = len(values)
wplct
2018-06-11 11:02:48 +08:00
你可以再改成一次跑多个 key 的统计,
EchoUtopia
2018-06-11 11:02:57 +08:00
postgres:
insert into words_count(word) values('example') on conflict do update set count=words_count.count + 1 returning id
FreeEx
2018-06-11 11:12:10 +08:00
流处理了解一下
kaiser1992
2018-06-11 11:14:17 +08:00
Java 读取文件哪有一次性加载到内存的
EchoUtopia
2018-06-11 11:15:58 +08:00
https://github.com/EchoUtopia/my-python-practices/blob/master/trie.js
之前用 js 统计了《心理学与生活》这本书的词频,用的前缀树,这本书纯文字只有 1M 多,我用 js 读取整本书、将单词插入前缀树、搜索一个单词、列出单词的频次并按照频次排序,所有操作加起来不到 0.5 秒。
BBCCBB
2018-06-11 11:24:20 +08:00
bufferreader 啊, 不都是流处理吗?
SoCrazyStone
2018-06-11 11:57:17 +08:00
Java 直接读就可以吧,不是一次加载进内存,然后存到数据库里,结束了再导到文件?
wplct
2018-06-11 12:35:56 +08:00
@EchoUtopia #15 想啥呢,内存放不下,应该是 gb 量级了
pathbox
2018-06-11 12:42:33 +08:00
一行一行的 read 处理 就没有大文件内存限制了
rrfeng
2018-06-11 12:44:17 +08:00
awk '!a[key:value]{n[key]++}END{for(i in n)print i,n[i]}'

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

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

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

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

© 2021 V2EX