V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
black11black
V2EX  ›  问与答

Python 快速进行大量序列化的最佳选择是什么? Pickle? json?

  •  
  •   black11black · Jan 13, 2021 · 2612 views
    This topic created in 1940 days ago, the information mentioned may be changed or developed.

    如题,现有一需求,需要夸空间、时间地共享内存状态,意思是多进程互相调用,且比如在今天有可能调用历史上某一次执行结果的状态。

    想了想,似乎还是序列化以后存数据库里最好。

    需要序列化的数据假定为长度十万的数组,内部只存字符串和浮点数两种数据,在这种情况下,Python 序列化最快的方案是什么呢?

    除了使用 cpython 解释器,其他协议等等均不限,不与前端通信,仅在后端之间交换。除了量特别大(比如每天要进行一千万次序列化与反序列化)

    18 replies    2021-01-13 16:29:51 +08:00
    helloworld000
        1
    helloworld000  
       Jan 13, 2021
    SD10
        2
    SD10  
       Jan 13, 2021 via iPhone
    100 多 QPS 很高了
    sunhk25
        3
    sunhk25  
       Jan 13, 2021 via Android
    从数据库拿出来再到反序列化会花掉不少时间,直接存数据库呗
    black11black
        4
    black11black  
    OP
       Jan 13, 2021
    @sunhk25 你有 py 对象要入库,无论如何还是得序列化和反序列化啊
    Wincer
        5
    Wincer  
       Jan 13, 2021 via Android
    pickle 在 3.8 版本比 json 快很多
    sunhk25
        6
    sunhk25  
       Jan 13, 2021 via Android
    @black11black 不是简单的数据库查询和计算而是需要整个对象的话,那还是 pickle 。
    php8
        7
    php8  
       Jan 13, 2021 via Android
    读写量级: 10M * 100K * 100,100TB 每天
    IO 速率: 100TB / 86400,1.2GB 每秒

    10G 网卡带宽打满,不优化设计?
    xchaoinfo
        8
    xchaoinfo  
       Jan 13, 2021 via Android
    我之前做过低频次百万级别数据的序列化,用的 pickle,是 pandas 处理后的数据。
    序列化直接存储文件,数据库记录文件位置和一些属性信息。
    black11black
        9
    black11black  
    OP
       Jan 13, 2021
    @php8 不是很理解这个算式,10M*100k 以后为什么要乘 100 呢,10M*100k 才 1T,没感觉有什么问题
    GoLand
        10
    GoLand  
       Jan 13, 2021
    用 protobuf 的序列化,还能跨语言。pickle 不能跨语言吧?
    seven123
        11
    seven123  
       Jan 13, 2021
    我用 msgpack
    php8
        12
    php8  
       Jan 13, 2021 via Android
    @black11black 浮点数 8 字节,字符串平均几十字节,按 100 字节做估算
    tmackan
        13
    tmackan  
       Jan 13, 2021
    @seven123 只支持 py
    tmackan
        14
    tmackan  
       Jan 13, 2021
    可以参考下 https://github.com/jvanasco/dogpile_backend_redis_advanced
    这里有有个测试数据
    tmackan
        15
    tmackan  
       Jan 13, 2021
    跨语言的话,还是用 json 吧一般,pickcle 不跨语言,之前研究过 dogpile 的缓存框架,默认是 pickle 。。。
    ruanimal
        16
    ruanimal  
       Jan 13, 2021
    msgpack 试试看
    tabris17
        17
    tabris17  
       Jan 13, 2021
    encode 是 cPickle 快,decode 是 msgpack 快,看应用场景了
    lizytalk
        18
    lizytalk  
       Jan 13, 2021
    pickle 快。json 可读性强,而且大部分语言都支持。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3486 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 11:43 · PVG 19:43 · LAX 04:43 · JFK 07:43
    ♥ Do have faith in what you're doing.