将CSV转DB文件耗时过长,寻求Python代码优化方案
哇,72小时的等待时间确实太煎熬了!换我肯定早就坐不住了,咱们来聊聊怎么把这个转换速度提上去,争取把时间压缩到几小时甚至更短👇
先换个高效的CSV读取方式:别自己手动逐行读CSV啦,用
pandas的read_csv工具,它底层是C实现的,比纯Python循环快N倍。还可以用chunksize参数分块读取,比如pd.read_csv("works-20210226.csv", chunksize=10000),这样既不会占满内存,又能批量处理数据。一定要用批量插入,别逐行怼数据库:如果之前是循环每一行执行一次INSERT语句,那速度慢到离谱——每一次插入都要和数据库建立交互,开销极大。建议把数据攒成一个列表,然后用数据库的批量插入方法:比如用SQLite的话,就用
cursor.executemany("INSERT INTO your_table (col1, col2...) VALUES (?, ?...)", data_batch),一次性提交,能把速度提升几十倍。要是用pandas的话,直接调用df.to_sql()方法,它默认就会做批量处理,省心又高效。给SQLite开个加速buff:如果用的是SQLite数据库,记得开启WAL模式,执行
conn.execute("PRAGMA journal_mode=WAL")就行。这个模式会把写入操作变成追加式,大幅提升写入速度,还允许读写并行。另外可以设置PRAGMA synchronous=OFF(不过这个要注意数据安全,要是中途断电可能丢数据,权衡着用)。减少不必要的中间处理:如果在转换过程中做了很多逐行的类型转换、字符串处理,尽量改成批量操作。比如日期转换,让pandas在读取CSV的时候直接解析:
pd.read_csv(..., parse_dates=["date_col"]),比你手动用datetime.date逐行处理快得多。硬件小技巧:如果你的CSV文件在机械硬盘(HDD)上,赶紧移到固态硬盘(SSD)上,IO速度能翻好几倍;另外尽量关掉其他占用资源的程序,给Python腾够内存和CPU。
按照这些方法调整,应该能把72小时的耗时砍下来一大截,试试看!
备注:内容来源于stack exchange,提问作者D7G0N _

