python - Python CSV 导入在前 200k 行之后花费了太多时间
问题描述
我有一个导入 CSV 的 python 导入脚本。将 20k 行导入 mysql 数据库大约需要 45 秒。问题是现在我有一个巨大的文件(400 万行),当它到达文件的 ~200k 行时,导入相同的 20k 行需要大约 200 秒。
我不知道那是一些数据库问题还是文件本身读取...这是我的脚本:
import csv
import mysql.connector
from mysql.connector import Error
import argparse
from itertools import islice
parser = argparse.ArgumentParser()
parser.add_argument('file', type=argparse.FileType('r'))
args = parser.parse_args()
def parseData(row):
sql = """INSERT INTO TABLE
(column1,column2)
VALUES( '%s','%s');""" % (
row['col1'],row['col2'],)
return sql
def dataImport(filename,connection,cursor):
data = csv.DictReader(filename,delimiter=';')
i = 0
for row in data:
sql = parseData(row)
try:
result = cursor.execute(sql)
pass
except Error as e:
pass
if i%20000 == 0:
connection.commit()
i=i+1
def importa(file):
try:
connection = mysql.connector.connect(host=host,
database=db,
user=user,
password=password)
if connection.is_connected():
db_Info = connection.get_server_info()
print("Connected to MySQL Server version ", db_Info)
cursor = connection.cursor()
dataImport(file,connection,cursor)
cursor.close()
except Error as e:
print("Error while connecting to MySQL", e)
if __name__ == "__main__":
importa(args.file)
解决方案
使用executemany
单次插入 20K 行而不是 20K 单个INSERT
语句将优化传输,但数据库本身也可能是性能下降的一个因素。有一个代码示例就在这个页面的中间一点。
根据我们交换的意见,数据库是性能缓慢的最终罪魁祸首。我见过的一个想法是禁用索引,直到所有内容都加载完毕。
ALTER TABLE table DISABLE KEYS;
... executemany called a bunch of times...
ALTER TABLE table ENABLE KEYS;
那可能值得一试。
推荐阅读
- javascript - 将数组数组导出到 CSV
- python - 使用 MultiIndex 透视 DataFrame
- go - 如何将 go 指针作为 wasm 上下文数据传递?
- python - 使用嵌套的 For 循环和 If 条件在另一个列表中查找数字列表
- integration - 在“转换 XML”Azure 逻辑应用连接器中选择地图时出错
- python - 如何将字符串值转换为数据框
- android - 我可以使用 MotionLayout 为 RecyclerView 中的单个项目设置动画吗?
- android - 仍然可以通过应用内结算 API 查看已取消的订阅
- ios - 制作 CKQuerySubscription 时“模糊使用 'firesOnRecordCreation'”
- javascript - Javascript中带有日期键的动态多维数组