超大 JSON 文件处理问题

2016-04-20 22:10:20 +08:00
 hansnow

背景

这些超大的 JSON 文件来自 Cuckoo Sandbox 的 report ,主要内容是一系列的系统 API 调用,包含 API 名称和参数。这些 JSON 文件大小一般在几十~几百 MB 之间。

需求

我的尝试

文件示例

一份55MB左右的JSON 链接: http://pan.baidu.com/s/1eRZevq6 密码: 2h95

求教

请问这种场景下有没有一个比较好的解决方案可以实现上面的需求?

6187 次点击
所在节点    问与答
17 条回复
Kisesy
2016-04-20 22:14:05 +08:00
能先提供一份这样的文件吗?
hansnow
2016-04-20 22:19:46 +08:00
@Kisesy 已经添加到正文
WittBulter
2016-04-20 22:33:04 +08:00
关注一波,我也有这样的问题
blahgeek
2016-04-20 22:50:44 +08:00
google "json sax parser"看看
yingjun424
2016-04-21 00:15:45 +08:00
有没有可能这样 将这个大文件先切分成若干个小文件 然后对每个小文件分别计算 最后将这些结果再综合计算…也就是 map reduce 的想法…这个只是拍脑袋想 但是可以往这方面想想…没必要一次性处理完
anerevol
2016-04-21 00:50:45 +08:00
用 swift 写了脚本跑了下, 55MB 文件处理内存占用 76M 的样子
hpeng
2016-04-21 01:06:27 +08:00
开始想到 Jackson 的 TreeNode 然后看了下内容,好吧 py
kn007
2016-04-21 01:34:43 +08:00
Mark ,明天睡醒看解决方案
iyaozhen
2016-04-21 01:49:17 +08:00
这个需求挺有意思的,也有类似的场景。感谢楼主提供数据,有时间试试。
ipconfiger
2016-04-21 02:08:56 +08:00
貌似 json 没有流式处理的方法......... 按道理来说应该是可以的
dapang1221
2016-04-21 02:17:45 +08:00
手机在线,还没看那个文件。。 json 能拆开么?拆成每个 api 一个 json ,或是按其他方式重新整理下,这样处理一遍扔进 mongodb 就能避免 16MB 大小问题了。而且这种系统的 api 也不频繁更新,弄一遍能用好久
qiukun
2016-04-21 10:15:47 +08:00
手写 dfa 。
hansnow
2016-04-21 11:32:37 +08:00
@dapang1221 整个 json 文件是一个大的 object ,貌似不是很容易分开
lxy42
2016-04-21 12:36:43 +08:00
我记得 Python 的 JSON 库在解析 json 时可以提供一个过滤的回调函数,这样就可以边解析边去重
lxy42
2016-04-21 13:59:55 +08:00
import json
import time

api_set = set()

def object_hook(dct):
if "api" in dct:
api_set.add(dct['api'])
return dct['api']
return dct
data = json.load(open("report2.json"), object_hook = object_hook)

print 'api length: {}'.format(len(api_set))
print
for api in api_set:
print api
#time.sleep(10)

=============
测试的文件是你上传到百度网盘的那个, windows10 下用任务管理器查看 python 进程内存占用峰值 60M ,但马上降下来。速度应该还行,不知道是否满足需求,楼主可以试试。
lxy42
2016-04-21 14:06:55 +08:00
hansnow
2016-04-21 18:48:18 +08:00
@qiukun 噗。。。完全不会的说

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

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

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

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

© 2021 V2EX