为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
莫回无 2021-12-27 15:27:50
我的任务是逐行读取 csv 文件并将它们插入数据库。csv 文件包含大约 170 万行。我使用 python 和 sqlalchemy orm(合并函数)来做到这一点。但它花了五个多小时。是python性能慢还是sqlalchemy或sqlalchemy造成的?或者如果我用golang来做,性能明显更好怎么办?(但我没有go的经验。另外,这个工作需要每个月安排一次)希望大家给点建议,谢谢!更新:数据库 - mysql
查看完整描述

2 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

对于这样的任务,您不想逐行插入数据:) 基本上,您有两种方法:

  1. 确保 sqlalchemy 不会一一运行查询。请改用 BATCHINSERT查询(如何在 MySQL 中进行批量插入)。

  2. 以您需要的方式按摩您的数据,然后将其输出到某个临时 CSV 文件中,然后LOAD DATA [LOCAL] INFILE按照上述建议运行。如果您不需要预处理数据,只需将 CSV 提供给数据库(我假设它是 MySQL)


查看完整回答
反对 回复 2021-12-27
?
森林海

TA贡献2011条经验 获得超2个赞

遵循以下三个步骤

  1. 使用要保存到的表的名称保存 CSV 文件。

  2. 执行下面的python脚本来动态创建一个表(更新CSV文件名,db参数)

  3. 执行“mysqlimport --ignore-lines=1 --fields-terminated-by=, --local -u dbuser -p db_name dbtable_name.csv”

蟒蛇代码

import numpy as np

import pandas as pd

from mysql.connector import connect


csv_file = 'dbtable_name.csv'

df = pd.read_csv(csv_file)

table_name = csv_file.split('.')


query = "CREATE TABLE " + table_name[0] + "( \n" 

for count in np.arange(df.columns.values.size):

    query += df.columns.values[count]

    if df.dtypes[count] == 'int64':

        query += "\t\t int(11) NOT NULL"

    elif df.dtypes[count] == 'object':

        query += "\t\t varchar(64) NOT NULL"

    elif df.dtypes[count] == 'float64':

        query += "\t\t float(10,2) NOT NULL"



    if count == 0:

        query += " PRIMARY KEY"


    if count < df.columns.values.size - 1:

        query += ",\n"


query += " );"

#print(query)


database = connect(host='localhost',  # your host

                     user='username', # username

                     passwd='password',     # password

                     db='dbname') #dbname

curs = database.cursor(dictionary=True)

curs.execute(query)

# print(query)


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信