如何保存变量到内存中,或文件中。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
m939594960
V2EX    问与答

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

  •  
      m939594960 2019-03-23 15:55:15 +08:00 3264 次点击
    这是一个创建于 2444 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    你说了只是解析慢,那就把解析后的内存数据结构保存下来,下次不需要再重新解析即可。Java 的序列化 /反序列化能做到,其他 VM 类语言应该也都能做到。JS、C 这类应该都做不到。
    m939594960
        22
    m939594960  
    OP
       2019-03-24 11:48:44 +08:00
    @ech0x #12 那个库说的每秒 2g 但是实际达不到
    m939594960
        23
    m939594960  
    OP
       2019-03-24 11:49:55 +08:00
    @wentaoliang #18 感觉很接近,我试试
    m939594960
        24
    m939594960  
    OP
       2019-03-24 11:52:45 +08:00
    @leis1015 #14 确实用了反射, 但是手撸结构实在太浪费时间了。 前三个我再了解了解。
    delectate
        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
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2303 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 15:44 PVG 23:44 LAX 07:44 JFK 10:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86