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

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

  •  
  •   m939594960 · 59 天前 · 1461 次点击
    这是一个创建于 59 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    你说了只是解析慢,那就把解析后的内存数据结构保存下来,下次不需要再重新解析即可。Java 的序列化 /反序列化能做到,其他 VM 类语言应该也都能做到。JS、C 这类应该都做不到。
        22
    m939594960   58 天前
    @ech0x #12 那个库说的每秒 2g 但是实际达不到
        23
    m939594960   58 天前
    @wentaoliang #18 感觉很接近,我试试
        24
    m939594960   58 天前
    @leis1015 #14 确实用了反射, 但是手撸结构实在太浪费时间了。 前三个我再了解了解。🙏
        25
    delectate   58 天前
    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
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4138 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 17ms · UTC 03:11 · PVG 11:11 · LAX 20:11 · JFK 23:11
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1