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

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

  •  
  •   black11black · 2021-01-13 03:34:00 +08:00 · 2004 次点击
    这是一个创建于 1415 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    10G 网卡带宽打满,不优化设计?
    xchaoinfo
        8
    xchaoinfo  
       2021-01-13 09:49:09 +08:00 via Android
    我之前做过低频次百万级别数据的序列化,用的 pickle,是 pandas 处理后的数据。
    序列化直接存储文件,数据库记录文件位置和一些属性信息。
    black11black
        9
    black11black  
    OP
       2021-01-13 10:10:34 +08:00
    @php8 不是很理解这个算式,10M*100k 以后为什么要乘 100 呢,10M*100k 才 1T,没感觉有什么问题
    GoLand
        10
    GoLand  
       2021-01-13 10:52:29 +08:00
    用 protobuf 的序列化,还能跨语言。pickle 不能跨语言吧?
    seven123
        11
    seven123  
       2021-01-13 11:05:36 +08:00
    我用 msgpack
    php8
        12
    php8  
       2021-01-13 11:56:14 +08:00 via Android
    @black11black 浮点数 8 字节,字符串平均几十字节,按 100 字节做估算
    tmackan
        13
    tmackan  
       2021-01-13 15:22:23 +08:00
    @seven123 只支持 py
    tmackan
        14
    tmackan  
       2021-01-13 15:25:46 +08:00
    可以参考下 https://github.com/jvanasco/dogpile_backend_redis_advanced
    这里有有个测试数据
    tmackan
        15
    tmackan  
       2021-01-13 15:27:21 +08:00
    跨语言的话,还是用 json 吧一般,pickcle 不跨语言,之前研究过 dogpile 的缓存框架,默认是 pickle 。。。
    ruanimal
        16
    ruanimal  
       2021-01-13 16:06:22 +08:00
    msgpack 试试看
    tabris17
        17
    tabris17  
       2021-01-13 16:25:36 +08:00
    encode 是 cPickle 快,decode 是 msgpack 快,看应用场景了
    lizytalk
        18
    lizytalk  
       2021-01-13 16:29:51 +08:00
    pickle 快。json 可读性强,而且大部分语言都支持。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3201 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:21 · PVG 21:21 · LAX 05:21 · JFK 08:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.