python写向数据库导入一个有100万行的csv文件,提高速度,还是要95秒

it2024-01-23  64

(1小记录)python写向数据库导入一个有100万行的csv文件,速度终于快了

一开始用load infile直接整个文件导入,结果Python报错:MemoryError

一开始用load infile直接整个文件导入,结果Python报错:MemoryError

导入语句: load_sql = “”" LOAD DATA lOCAL INFILE ‘{}’ INTO TABLE {} FIELDS TERMINATED by ‘,’ optionally enclosed by ‘"’ escaped by ‘"’ lines terminated by “\r\n”;;""".format (tempCSVDir, tableName) 解决方案: 1、把文件分成1万行进行100次导入,写入临时文件,再读入,结果花了17分钟! 2、尝试着一次读多些行,发现其实导入10万行速度也是快的,花了95秒 3、导入30万行速度也是花了95秒 4、自己写了一个函数进行文件分割: fileDir:文件完整路径 ig:忽略文件几行 row:导入文件几行 timenum:第几次调用 allNrows:全部导入几行了 fileName:文件名字 tempCSVPath:存放临时csv文件的位置,结尾是带/的 (1)中间try…except…是因为文件编码太多种了… (2)一开始try…except…是因为文件如果截取到全部空行的话会报错,这时候我就判断为截取文件完毕 (3)load data infile 中间加了local 是因为我导入的文件是在共享盘上(映射到本地)的文件

// An highlighted block def read_part_file(fileDir,ig,row,timenum,allNrows,fileName,tempCSVPath): try: if ".csv" in fileDir: try: fileData = pd.read_csv(fileDir,skiprows=ig, nrows=row, low_memory=False, encoding='utf_8_sig') except: fileData = pd.read_csv(fileDir,skiprows=ig, nrows=row, low_memory=False, encoding='gb2312') elif ".xls" in fileDir: fileData = pd.read_excel(fileDir,skiprows=ig, nrows=row) allNrows = allNrows + fileData.iloc[:, 0].size+1 except: print("第%d次调用,空" %timenum) print("文件分片结束") print("一共导入%d行" %allNrows) return print("第%d次调用" % timenum) print("忽略%d行" % ig) print("导入%d行" % row) ig = ig + row + 1 nrows = fileData.iloc[:, 0].size + 1 print("本次导入"+str(nrows)+"行") print(fileData) timenum = timenum+1 strTimeNum = str(timenum) tempCSVDir = tempCSVPath + strTimeNum + fileName fileData.to_csv(tempCSVDir, index=False, encoding='utf_8_sig') # 连接数据库 host = "localhost" user = "root" password = "111" db = "mydb" # 打开数据库连接 db = pymysql.connect(host, user, password, db, charset='utf8', local_infile=1) # 使用cursor()方法获取操作游标 cursor = db.cursor() print("Connected to DB:{}".format(host)) # 导入csv文件 load_sql = """ LOAD DATA lOCAL INFILE '{}' INTO TABLE {} FIELDS TERMINATED by ',' optionally enclosed by '"' escaped by '"' lines terminated by "\r\n";;""".format (tempCSVDir, tableName) try: cursor.execute(load_sql) except Exception as e: print("Error:{}".format(str(e))) sys.exit(1) print(str(tempCSVDir) + '成功!') cursor.connection.commit() # 执行commit操作,插入语句才能生效[每次总是差了这么两句] db.close() return read_part_file(fileDir, ig, row, timenum, allNrows, fileName,tempCSVPath)
最新回复(0)