#python#pandas# 读取很大的xlsx效率速度太慢
2022 3月遇到这个问题,一般每个月的数据一个文件,大约130Mb 左右。
用于测试的典型文件 584k lines x 15 cols xlsx 文件 127 Mb, 数据都在 Sheet1. 14 columns 文本格式 和 1 column uint32.
因为xlsx 文件是 合作伙伴从他们的数据库系统导出的,我这是第三手拿到数据了。也很难去要求他们导出为csv. xlsx 好像还不是标准的 office xlsx,office 可以打开的。
测试结果大致如下,记录下。
环境:Win10, 4core cpu i5 2010, python3.9.x in wxpython portable pacakge.
method | time |
---|---|
xlrd 1.2.0 open_workbook | Wall time: 8min 10s |
xlrd3 | Wall time: 3min 17s |
openpyxl 3.0.9 load_workbook read_only=True data_only=True | Wall time: 275 ms |
openpyxl 3.0.9 load_workbook read_only=True data_only=True .values to dataframe | Wall time: 2min 21s |
openpyxl 3.0.9 load_workbook | Wall time: 31min 46s |
pandas 1.4.1 read_xlsx engine=openpyxl | wall time: 4min 33s |
modin[ray] pandas==1.4.0 ray>=1.4.0 | consider read pickle comparison, shall be very fast less ** |
xlsx_csv 0.1.0 to csv;pd.read_csv;os.remove(temp_csv) | Wall time: 33.2 s |
datatable 1.0.0 + xlrd==1.2.0 | Wall time: 4min 17s |
** 因为 modin[ray] 还有bug 已经报告:只读出来 ~6k 行。
** 还有一个我没去研究解决的问题,就是读出来的 dataframe 是modin格式的,不能当成标准的pd.DataFrame 用. 很多功能还没有做到跟pandas一样。 如有哪位同学知道如何转换 modin pd.DataFrame 到 标准的pd.DataFrame.
xlsx => csv 两个工具的比较:
method | time |
---|---|
xlsx2csv | # 114386 x 15 13.1+ MB; Wall time: 11.6 s |
xlsx_csv 0.1.0 to csv | # 14386 x 15 13.1+ MB; Wall time: 2.5 s |
xlsx_csv.xlsx2csv(fn, "Sheet1")
xlsx2csv.Xlsx2csv(fn).convert("e:/test.csv", sheetid=1)
@todo never try command shell tools like csvkit etc. maybe faster?