如何保存变量到内存中,或文件中。

2019-03-23 15:55:15 +08:00
 m939594960

现在有个格式非常混乱的 JSON 文件,需要我解析之后进行分析。由于需要遍历数据,所以没办法流式加载。

每次解析这个 JSON 文件都需要很长时间,导致我调试程序非常非常麻烦。

又没什么办法能把存放解析结果的变量存储在某个内存区域 或者 以二进制的形式存到文件,然后下次运行的时候可以直接读取,不用每次都重新解析这个 json。

不限定语言,Golang php python js 都行,因为只是一个简单的数据处理。

2853 次点击
所在节点    问与答
25 条回复
Nitroethane
2019-03-23 16:03:04 +08:00
你可以把这个文件保存到 /dev/shm 或者 /tmp 或者其他内存文件系统上面,这样的话是直接从内存中读取,速度应该会变快
m939594960
2019-03-23 16:04:12 +08:00
@Nitroethane #1 打开文件的时间还是可以接受的,主要是 JSON.parse() 的速度太慢了
liukangxu
2019-03-23 16:06:17 +08:00
json 导入到 mongodb 里试试?
Orenoid
2019-03-23 16:16:16 +08:00
用 python 的 pickle 模块试试,不知道我有没有理解错,应该能解决你说的问题
RqPS6rhmP3Nyn3Tm
2019-03-23 16:25:58 +08:00
你的需求应该是用数据库
m939594960
2019-03-23 16:28:51 +08:00
@Orenoid #4 这个尝试过,每次 load 的时候还是很慢,应该也是会解析格式的,而且貌似还有压缩解压的操作。
m939594960
2019-03-23 16:29:55 +08:00
@BXIA #5
@liukangxu #3
我想解析的时 aws 的价格表,里面的 json 是一个大的 object,没办法分条存,如果存成一个也就没有意义了
ech0x
2019-03-23 16:41:35 +08:00
解析的满应该第一反应是换解析库吧,试试 simplejson
m939594960
2019-03-23 17:21:58 +08:00
@ech0x #8 我刚试过 github 开源的那个号称 每秒解析 2g 的那个库,也是很慢
mattx
2019-03-23 17:35:25 +08:00
解析以后存到 mongodb 里面
ma6254
2019-03-23 17:42:00 +08:00
直接存数据库里把
或者把程序拆开来,单独做个类似数据库的预加载端,每次调试只要连进去就好了
ech0x
2019-03-23 17:51:36 +08:00
@m939594960 每秒 2G 还嫌慢,是不是本身程序的复杂度有问题啊,我觉得你需要重构一下代码,考虑复杂度了。
MeteorCat
2019-03-23 17:53:36 +08:00
不要存进内存里,如果数据 4G+全加进内存直接服务器爆炸.............
leis1015
2019-03-23 18:06:27 +08:00
1、共享内存
2、程序间用命名管道传输数据,给你关键词 ipc,有好多种通讯方式
3、直接把对象序列化成该语言二进制然后再读,直接搜语言名+序列化
4、我怀疑你 json 解析速度慢是因为用了反射,试试读的同时手撸结构,简单一个 prase 是简单,用反射就不可能快
Chowe
2019-03-23 19:27:53 +08:00
C 了解下
快到没朋友
h175h32
2019-03-23 19:39:28 +08:00
搞到数据库里 redis 呢
lizhuoli
2019-03-23 20:21:12 +08:00
这不就是 mmap 吗?
wentaoliang
2019-03-23 20:30:05 +08:00
如果用 php yac 可解
icyalala
2019-03-23 22:47:55 +08:00
可以考虑将 JSON 转为 MessagePack 之类的二进制格式,能够节省很多解析时间。
或者可以再尝试一下其他支持 Zero-copy 的格式: https://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats
HFcbyqP0iVO5KM05
2019-03-24 09:33:41 +08:00
看看 python multiprocessing 模块的 Manager

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

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

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

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

© 2021 V2EX