读取 csv 并插入到数据库性能

我的任务是逐行读取 csv 文件并将它们插入数据库。

csv 文件包含大约 170 万行。

我使用 python 和 sqlalchemy orm(合并函数)来做到这一点。但它花了五个多小时。

是python性能慢还是sqlalchemy或sqlalchemy造成的?

或者如果我用golang来做,性能明显更好怎么办?(但我没有go的经验。另外,这个工作需要每个月安排一次)

希望大家给点建议,谢谢!

更新:数据库 - mysql


莫回无
浏览 171回答 2
2回答

收到一只叮咚

对于这样的任务,您不想逐行插入数据:) 基本上,您有两种方法:确保 sqlalchemy 不会一一运行查询。请改用 BATCHINSERT查询(如何在 MySQL 中进行批量插入)。以您需要的方式按摩您的数据,然后将其输出到某个临时 CSV 文件中,然后LOAD DATA [LOCAL] INFILE按照上述建议运行。如果您不需要预处理数据,只需将 CSV 提供给数据库(我假设它是 MySQL)

森林海

遵循以下三个步骤使用要保存到的表的名称保存 CSV 文件。执行下面的python脚本来动态创建一个表(更新CSV文件名,db参数)执行“mysqlimport --ignore-lines=1 --fields-terminated-by=, --local -u dbuser -p db_name dbtable_name.csv”蟒蛇代码:import numpy as npimport pandas as pdfrom mysql.connector import connectcsv_file = 'dbtable_name.csv'df = pd.read_csv(csv_file)table_name = csv_file.split('.')query = "CREATE TABLE " + table_name[0] + "( \n"&nbsp;for count in np.arange(df.columns.values.size):&nbsp; &nbsp; query += df.columns.values[count]&nbsp; &nbsp; if df.dtypes[count] == 'int64':&nbsp; &nbsp; &nbsp; &nbsp; query += "\t\t int(11) NOT NULL"&nbsp; &nbsp; elif df.dtypes[count] == 'object':&nbsp; &nbsp; &nbsp; &nbsp; query += "\t\t varchar(64) NOT NULL"&nbsp; &nbsp; elif df.dtypes[count] == 'float64':&nbsp; &nbsp; &nbsp; &nbsp; query += "\t\t float(10,2) NOT NULL"&nbsp; &nbsp; if count == 0:&nbsp; &nbsp; &nbsp; &nbsp; query += " PRIMARY KEY"&nbsp; &nbsp; if count < df.columns.values.size - 1:&nbsp; &nbsp; &nbsp; &nbsp; query += ",\n"query += " );"#print(query)database = connect(host='localhost',&nbsp; # your host&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;user='username', # username&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;passwd='password',&nbsp; &nbsp; &nbsp;# password&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;db='dbname') #dbnamecurs = database.cursor(dictionary=True)curs.execute(query)# print(query)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go