V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
m939594960
V2EX  ›  问与答

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

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

    现在有个格式非常混乱的 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   ·   实用小工具   ·   2629 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 04:33 · PVG 12:33 · LAX 20:33 · JFK 23:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.