pandas 的 to_excel,在几十万条数据(也可能上百万)的情况下太慢了该怎么解决? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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

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

  •  1
     
  •   lluuiq Mar 31, 2021 4827 views
    This topic created in 1852 days ago, the information mentioned may be changed or developed.

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

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

    Excel 本身处理几十万行、十几列的表格数据其实问题不大,只是 lz 的需求没必要。
    neoblackcap
        13
    neoblackcap  
       Mar 31, 2021
    上百万的数据如果还要导出成 xlsx 格式,那么工作就会很有可能就会出现问题。原因是 xlsx 文件并不支持那么多数据。xlsx 最大行数为 2^20 = 1048576,你超过 100 万行的数据请考虑使用更加合适的工具,比如数据库
    F281M6Dh8DXpD1g2
        14
    F281M6Dh8DXpD1g2  
       Mar 31, 2021 via iPhone
    不给人看转成 csv 的你们是认真的么....转成二进制格式多好....
    kkbblzq
        15
    kkbblzq  
       Apr 1, 2021
    别 excel 了,多了内存也会炸
    rationa1cuzz
        16
    rationa1cuzz  
       Apr 1, 2021
    我好奇你生成后能顺利打开吗? 前几天还帮同学处理个雨量统计表 3M 多的 xlsx,一个大概十几秒
    openpyxl engine=xlwrite 能快一点
    HankLu
        17
    HankLu  
       Apr 1, 2021
    to_csv,10 万条我的联想小新 Air15 只要十秒左右
    lluuiq
        18
    lluuiq  
    OP
       Apr 2, 2021
    @rationa1cuzz 能打开 就是 40+M 的文件要加载个 10 秒左右
    lluuiq
        19
    lluuiq  
    OP
       Apr 2, 2021
    @HankLu 已经换成 csv 了,耗时从接近 10 分钟变成了几秒。。
    About     Help     Advertise     Blog     API     FAQ     Solana     5775 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 68ms UTC 07:17 PVG 15:17 LAX 00:17 JFK 03:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86