V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lluuiq
V2EX  ›  Python

pandas 的 to_excel,在几十万条数据(也可能上百万)的情况下太慢了该怎么解决?

  •  1
     
  •   lluuiq · 2021-03-31 20:47:03 +08:00 · 4147 次点击
    这是一个创建于 1320 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个需求是导出某个部门下的所有数据,以某个部门为例查询出来就有 60+W 条数据。
    目前是后端查询出来给 pandas 、pandas 用 to_excel 方法生成 excel,最后传文件流给前端。
    然后发现时间全耗在了 to_excel 这里,生成 40+M 大小的文件耗时 10 分钟左右。
    有什么办法能优化到一两分钟以内吗

    19 条回复    2021-04-02 09:47:21 +08:00
    superrichman
        1
    superrichman  
       2021-03-31 20:53:07 +08:00 via iPhone   ❤️ 2
    to_csv
    noqwerty
        2
    noqwerty  
       2021-03-31 20:55:29 +08:00 via Android
    先看看 csv 要多长时间,排除 io 的问题。如果 csv 没问题的话可以尝试换其他的 Excel writer engine,pandas 默认的好像很慢
    renmu123
        3
    renmu123  
       2021-03-31 20:55:51 +08:00 via Android
    你导出成 CSV 应该会快很多,或者 to_dict 后用 openpyxl 的一个快速写入(具体不记得叫啥了)模式写入试试看吧。
    如果数据不需要 pandas 处理,没必要用 pandas 来转换啊。
    TimePPT
        4
    TimePPT  
       2021-03-31 21:02:52 +08:00 via Android
    一般超过 10 万行就 csv 吧,你这存着费劲,接收方打开也费劲。
    后来我还给运营培训过 sql,之后就开始导 sqlite db 文件给他们自己用了,随便用😂
    wuwukai007
        5
    wuwukai007  
       2021-03-31 21:19:09 +08:00 via Android
    xlwings,如果不是逐行写的话,速度蛮快的,不过 40m 的一般电脑打开直接卡白屏吧
    wuwukai007
        6
    wuwukai007  
       2021-03-31 21:22:01 +08:00 via Android
    还有 engine=xlwrite,我之前用过比 openpyxl 速度快 40%
    左右
    lluuiq
        7
    lluuiq  
    OP
       2021-03-31 21:24:49 +08:00
    @renmu123 需要处理一些 转换格式 填充 nan 值之类的 。。
    lluuiq
        8
    lluuiq  
    OP
       2021-03-31 21:25:57 +08:00
    @noqwerty 尝试了一下 csv 写入 csv 速度特别快,但是返回文件时变慢了 😂
    hs0000t
        9
    hs0000t  
       2021-03-31 21:50:08 +08:00 via Android
    @lluuiq 导出后打压缩包再返回
    lithiumii
        10
    lithiumii  
       2021-03-31 22:09:06 +08:00 via Android
    都六十万条数据了,excel 不合适了吧,毕竟 excel 是给人看
    Thymolblue
        11
    Thymolblue  
       2021-03-31 22:10:28 +08:00
    如果是 2D 数据的话可以考虑科学数据集(高于 3D 可能需要转换)
    比如 hdf5
    pandas 是能直接导出 hdf5 的
    snw
        12
    snw  
       2021-03-31 22:23:51 +08:00 via Android
    如果中间不需要给人看,没必要经过 excel 格式,用 csv 就行。

    Excel 本身处理几十万行、十几列的表格数据其实问题不大,只是 lz 的需求没必要。
    neoblackcap
        13
    neoblackcap  
       2021-03-31 22:59:26 +08:00
    上百万的数据如果还要导出成 xlsx 格式,那么工作就会很有可能就会出现问题。原因是 xlsx 文件并不支持那么多数据。xlsx 最大行数为 2^20 = 1048576,你超过 100 万行的数据请考虑使用更加合适的工具,比如数据库
    liprais
        14
    liprais  
       2021-03-31 23:00:02 +08:00 via iPhone
    不给人看转成 csv 的你们是认真的么....转成二进制格式多好....
    kkbblzq
        15
    kkbblzq  
       2021-04-01 14:44:40 +08:00
    别 excel 了,多了内存也会炸
    rationa1cuzz
        16
    rationa1cuzz  
       2021-04-01 16:36:09 +08:00
    我好奇你生成后能顺利打开吗? 前几天还帮同学处理个雨量统计表 3M 多的 xlsx,一个大概十几秒
    openpyxl engine=xlwrite 能快一点
    HankLu
        17
    HankLu  
       2021-04-01 23:34:17 +08:00
    to_csv,10 万条我的联想小新 Air15 只要十秒左右
    lluuiq
        18
    lluuiq  
    OP
       2021-04-02 09:44:33 +08:00
    @rationa1cuzz 能打开 就是 40+M 的文件要加载个 10 秒左右
    lluuiq
        19
    lluuiq  
    OP
       2021-04-02 09:47:21 +08:00
    @HankLu 已经换成 csv 了,耗时从接近 10 分钟变成了几秒。。😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   950 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 777ms · UTC 19:41 · PVG 03:41 · LAX 11:41 · JFK 14:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.