首页 > 解决方案 > 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)

标签: pythonmysqlimport-csv

解决方案


使用executemany单次插入 20K 行而不是 20K 单个INSERT语句将优化传输,但数据库本身也可能是性能下降的一个因素。有一个代码示例就在这个页面的中间一点。

根据我们交换的意见,数据库是性能缓慢的最终罪魁祸首。我见过的一个想法是禁用索引,直到所有内容都加载完毕。

ALTER TABLE table DISABLE KEYS;
... executemany called a bunch of times...
ALTER TABLE table ENABLE KEYS;

那可能值得一试。


推荐阅读