现在有个格式非常混乱的 JSON 文件,需要我解析之后进行分析。由于需要遍历数据,所以没办法流式加载。
每次解析这个 JSON 文件都需要很长时间,导致我调试程序非常非常麻烦。
又没什么办法能把存放解析结果的变量存储在某个内存区域 或者 以二进制的形式存到文件,然后下次运行的时候可以直接读取,不用每次都重新解析这个 json。
不限定语言,Golang php python js 都行,因为只是一个简单的数据处理。
1
Nitroethane 2019-03-23 16:03:04 +08:00
你可以把这个文件保存到 /dev/shm 或者 /tmp 或者其他内存文件系统上面,这样的话是直接从内存中读取,速度应该会变快
|
2
m939594960 OP @Nitroethane #1 打开文件的时间还是可以接受的,主要是 JSON.parse() 的速度太慢了
|
3
liukangxu 2019-03-23 16:06:17 +08:00
json 导入到 mongodb 里试试?
|
4
Orenoid 2019-03-23 16:16:16 +08:00 1
用 python 的 pickle 模块试试,不知道我有没有理解错,应该能解决你说的问题
|
5
RqPS6rhmP3Nyn3Tm 2019-03-23 16:25:58 +08:00 via iPhone
你的需求应该是用数据库
|
6
m939594960 OP @Orenoid #4 这个尝试过,每次 load 的时候还是很慢,应该也是会解析格式的,而且貌似还有压缩解压的操作。
|
7
m939594960 OP |
8
ech0x 2019-03-23 16:41:35 +08:00 via iPhone 1
解析的满应该第一反应是换解析库吧,试试 simplejson
|
9
m939594960 OP @ech0x #8 我刚试过 github 开源的那个号称 每秒解析 2g 的那个库,也是很慢
|
10
mattx 2019-03-23 17:35:25 +08:00 via iPhone
解析以后存到 mongodb 里面
|
11
ma6254 2019-03-23 17:42:00 +08:00
直接存数据库里把
或者把程序拆开来,单独做个类似数据库的预加载端,每次调试只要连进去就好了 |
12
ech0x 2019-03-23 17:51:36 +08:00 via iPhone
@m939594960 每秒 2G 还嫌慢,是不是本身程序的复杂度有问题啊,我觉得你需要重构一下代码,考虑复杂度了。
|
13
MeteorCat 2019-03-23 17:53:36 +08:00 via Android
不要存进内存里,如果数据 4G+全加进内存直接服务器爆炸.............
|
14
leis1015 2019-03-23 18:06:27 +08:00 via iPhone 1
1、共享内存
2、程序间用命名管道传输数据,给你关键词 ipc,有好多种通讯方式 3、直接把对象序列化成该语言二进制然后再读,直接搜语言名+序列化 4、我怀疑你 json 解析速度慢是因为用了反射,试试读的同时手撸结构,简单一个 prase 是简单,用反射就不可能快 |
15
Chowe 2019-03-23 19:27:53 +08:00 via iPhone
C 了解下
快到没朋友 |
16
h175h32 2019-03-23 19:39:28 +08:00
搞到数据库里 redis 呢
|
17
lizhuoli 2019-03-23 20:21:12 +08:00 via iPhone 1
这不就是 mmap 吗?
|
18
wentaoliang 2019-03-23 20:30:05 +08:00 via iPhone 1
如果用 php yac 可解
|
19
icyalala 2019-03-23 22:47:55 +08:00
可以考虑将 JSON 转为 MessagePack 之类的二进制格式,能够节省很多解析时间。
或者可以再尝试一下其他支持 Zero-copy 的格式: https://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats |
20
HFcbyqP0iVO5KM05 2019-03-24 09:33:41 +08:00 via Android
看看 python multiprocessing 模块的 Manager
|
21
H0H 2019-03-24 11:01:51 +08:00
不限定语言的话,Java 的序列号 /反序列化就能搞定啊。
你说了只是解析慢,那就把解析后的内存数据结构保存下来,下次不需要再重新解析即可。Java 的序列化 /反序列化能做到,其他 VM 类语言应该也都能做到。JS、C 这类应该都做不到。 |
22
m939594960 OP @ech0x #12 那个库说的每秒 2g 但是实际达不到
|
23
m939594960 OP @wentaoliang #18 感觉很接近,我试试
|
24
m939594960 OP @leis1015 #14 确实用了反射, 但是手撸结构实在太浪费时间了。 前三个我再了解了解。🙏
|
25
delectate 2019-03-24 15:43:00 +08:00
Simdjson:一个超高速的 JSON 解析工具 https://www.freebuf.com/sectool/198277.html
simdjson 使用的指令比最先进的解析器 RapidJSON 少四分之三,比 sajson 少百分之五十。据我们所知,simdjson 是第一个在商用处理器上以每秒千兆字节运行的完全验证的 JSON 解析器。 解析器 GB /秒 simdjson 2.2 RapidJSON 编码验证 0.51 RapidJSON 编码验证,原位 0.71 sajson (原状,动态) 0.70 sajson ( insitu,static ) 0.97 dropbox 0.14 FASTJSON 0.26 gason 0.85 ultrajson 0.42 jsmn 0.28 cJSON 0.34 |