Python:CSV写入速度非常慢,需要加速建议

7
我正在使用一个简单的脚本从Oracle DB中提取数据,并使用CSV writer将数据写入CSV文件。
我查询的表包含大约25k条记录,脚本运行得很完美,但实际上非常缓慢。它需要25分钟才能完成。
通过修改代码,有哪些方法可以加快速度?欢迎您这些英雄提供任何提示。
#
# Load libraries
#
from __future__ import print_function
import cx_Oracle
import time
import csv

#
# Connect to Oracle and select the proper data
#
con = cx_Oracle.connect('secret')
cursor = con.cursor()
sql = "select * from table"

#
# Determine how and where the filename is created
#
path = ("c:\\path\\")
filename = time.strftime("%Y%m%d-%H%M%S")
extentionname = (".csv")
csv_file = open(path+filename+extentionname, "w")

writer = csv.writer(csv_file, delimiter=',', lineterminator="\n", 
quoting=csv.QUOTE_NONNUMERIC)

r = cursor.execute(sql)
for row in cursor:
    writer.writerow(row)

cursor.close()
con.close()
csv_file.close()

"完成需要25分钟。":您如何确定大部分时间都被for row ... writer.writerrow(...所消耗?" - stovfl
1
csv.writer很可能不会出错。如果“table”确实是一个表而不是视图,那么我会首先检查这个问题。Oracle会优化查询以获取前500行(假设您正在使用SQL Developer测试SELECT)。或者这个表非常宽,这意味着您每一行都要下载和写入大量数据-即使只有25K。 - Robert Co
在cx_Oracle方面,调整fetch arraysize。在数据库方面,调整索引。对于Oracle Net,请调整套接字缓冲区和SDU大小 - Christopher Jones
1
据报道,在 Python 的 csv.DictWriter 中设置 extrasaction ='ignore' 可以显著加速程序。虽然我个人没有看到这种改进,但在某些使用情况下可能是有效的。 - LondonRob
我发现 extrasaction='ignore' 可以加速它,但这取决于你的 CSV 有多少字段。我的 CSV 只有 3 个字段,获得了 20% 的提升。 - Ralph Willgoss
显示剩余2条评论
1个回答

0
你尝试使用 csv 模块中的 writerows 函数了吗?它可以一次性写入所有记录,而不是逐个写入,这样可以加快速度。
data = [] #data rows

with open('csv_file.csv', 'w') as csv_file:
    writer = csv.DictWriter(csv_file)
    writer.writeheader()
    writer.writerows(data)

另外,您也可以使用pandas模块将大量数据写入CSV文件。该方法在此处中通过示例进行了说明。


为什么writerows会更快?瓶颈很可能在“写入磁盘”部分,因为文件IO比其他操作要慢得多。 - Pranav Hosangadi
您是正确的,文件I / O操作在将数据写入磁盘时可能会成为瓶颈,使用writerows()相比writerow()可以进行优化。writerows()可以通过允许您在单个操作中写入多行数据来减少文件I / O操作的开销。当您使用writerow()时,每次调用该函数都会打开并写入文件。 - CodeThreads
2
我可以有一个来源吗?据我所知,只要您拥有open返回的文件描述符,文件就会保持打开状态。 - Pranav Hosangadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接