Python 读取 Excel 超大数据文件问题

2019-08-09 10:10:31 +08:00
 joson1205
一个交易记录数据 xlsx 文件,存在两个 Sheet,行数分别是 2w,15w,列数 45+左右,需要自动化生成一份报表,报表的数据由这两个 Sheet 交叉运算得出,目前做法是 xlrd 读取到内存然后 xlsxwriter 写入一个新的文件中.
因为某些原因,该交易记录的数据不能存入数据库里面,暂时只能以表格形式存放,每次读取的时候都很费时间,考虑分块读取,好像库并不支持,pandas 类的 chunksize,基本都是针对 CSV 文件,有没有更好的办法解决读取速度慢的问题??
9077 次点击
所在节点    Python
36 条回复
leavic
2019-08-09 15:19:59 +08:00
xlrd 已经挺快了,但是我印象中 xls 格式比 xlsx 格式快 N 倍。
leavic
2019-08-09 15:20:40 +08:00
之前写过一个分析从长生产数据的脚本,大概就是 2~3 万行的样子,我就直接要求他们把 excel 转成 2003 格式,否则太慢了。
joson1205
2019-08-09 15:21:56 +08:00
@leavic 限制行数太少了,也满足不了日常业务需求
joson1205
2019-08-09 16:42:43 +08:00
@youthfire 简单搜索一下关于 pyExcelerate 的资料,这个库好像不支持添加单元格批注的,是我没找到方法吗?资料实在太少了,知道的可以告诉我一下,谢谢
chong3397
2019-08-09 16:44:19 +08:00
插个眼,感觉将来会遇到类似的问题
omph
2019-08-09 16:49:00 +08:00
xlsx 转 csv,可以用其它程序做,go、rust 应该都有
wuwukai007
2019-08-09 17:06:51 +08:00
xlrd 真的很慢,之前开多个进程,勉强用着
snw
2019-08-09 17:32:41 +08:00
@joson1205
VBA 对基本数据格式的加减乘除运算不会慢到哪里去。对于 Black-Scholes 涉及的正态分布之类可以用数值计算自己写,比自带公式快。还有些写法上的注意点(比如 a*a*a 比 a^3 快)。

VBA 的速度劣势是 Object 的 GC 慢(打包在 Collection 或 Dictionary 时能感觉到),时间复杂度是平方关系,10 万个 Object 的 GC 大概在 10 秒左右。
另外 VBA 现成的操作 Array 轮子几乎没有,要快的话需要直接调用库。

VBA 的优势在于可以读写 xlsb 格式,体积和打开保存速度比 xls, xlsx 好得多。
youthfire
2019-08-09 17:33:26 +08:00
@joson1205 印象中是没有的,或者我自己也没找到。其实这个库可以说有点简陋,更新频率也低,但对于不复杂的大批量 excel 文本写入,速度惊人,当初也是从 stack overflow 看到别人讨论 xlsx/xlsm 写入速度优化知道的。另外一个我自己遇到的问题是对于日期的支持不理想。
youthfire
2019-08-09 17:36:02 +08:00
@snw xlsb 确实是好东西,然而支持他的库太少了,相对 xlsx/xlsm
joson1205
2019-08-09 17:43:41 +08:00
@snw 其实刚开始拿到报表的时候就是用的 VBA 实现的,后面经过一系列的调整,运算已经是越来越复杂,而且又涉及到拆分,样式,单元格的合并等等这些,优化过一次,电脑还是都直接卡死,没办法,才考虑用的 Python.
可能是我水平不够....见笑..
deorth
2019-08-10 00:34:22 +08:00
我现在每天拿 openpyxl 写入 100w 行的数据到 xlsx,要跑 3 分钟😅
jiang123574
2019-08-13 11:31:02 +08:00
xlwings 可以看看这个 读取超快
joson1205
2019-08-13 12:14:51 +08:00
@jiang123574 嗯,已经用上了,目前用的就是它
wangweiggsn
2020-04-20 23:20:20 +08:00
@snw 我也用了很多 xlsb 格式文件,用 pyxlsb 处理很快。慢是由于 office 的 com 接口引起的,只要能绕开 com 接口,当文本处理 excel 文件,都很快。
d5d
2021-04-29 15:09:06 +08:00
前来挖坟

遇到同样的问题,pandas to_excel 用 openpyxl 执行起来循环写入多个 execel 的 sheet.模式用 append 效率比较慢.


大佬们用什么办法?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/590369

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX