gpt4 book ai didi

python - 为什么填充我的表需要这么长时间?

转载 作者:行者123 更新时间:2023-11-28 22:02:54 24 4
gpt4 key购买 nike

我正在通过 Web 表单将一个 csv 文件加载到我的数据库中。

原始数据的顺序在每个 csv 文件中都是一致的,但它会根据源文件的不同而变化,所以我有一个显示五行的预览表单,并允许您通过下拉分配一列 -表中有效列名的向下列表。

然后我使用 cgi 形式构建一个 INSERT 语句,并逐行解析 csv 文件以填充表。

但是它运行起来非常慢。我同时填充了两个表,一个有 961402 行(7 列有值),另一个有 1835538​​ 行(1 列有值),每个表都运行了至少半小时。我每秒只能看到大约 100 行新行。

你能在这里看到任何让我慢下来的东西吗?

注意:我知道这里有一些丑陋的代码,它是我在弄清楚这种语言时编写的第一个 python cgi 脚本之一。

 for item in form:
field = form.getvalue(item)
field = cgi.escape(field)
if field == 'null':
pass
elif item == 'csvfile':
pass
elif item == 'campaign':
pass
elif item == 'numfields':
pass
else:
colname = str(colname) + ", " + str(item)

colnum.append(field)
assert(numfields > 0)
placeholders = (numfields-1) * "%s, " + "%s"
query = ("insert into %s (%s)" % (table, colname.lstrip(",")))
with open(fname, 'rb') as f:
reader = csv.reader(f)
try:
record = 0
errors = 0
for row in reader:
try:
record = record + 1
data = ''
for value in colnum:
col = int(value)
rawrow = row[col]
saferow = rawrow.replace("'", "-")
saferow = saferow.replace("-", "")
data = str(data) + ", '" + saferow + "'"
dataset = data.lstrip(',')
insert = query + (" values (%s)" % dataset)
cur.execute(insert)
con.commit()
print ".",
except IndexError, e:
print "Row:%d file %s, %s<br>" % (reader.line_num, fname.lstrip("./files/"), e)
errors = errors + 1
except csv.Error, e:
print "Row:%s file %s, line %d: %s<br>" % (record, fname, reader.line_num, e)
errors = errors + 1
except mdb.Error, e:
print "Row:%s Error %d: %s<br>" % (record, e.args[0], e.args[1])
errors = errors + 1
except:
t,v,tb = sys.exc_info()
print "Row:%s %s<br>" % (record, v)
errors = errors + 1
except csv.Error, e:
print "except executed<br>"
sys.exit('file %s, line %d: %s' % (fname, reader.line_num, e))
print "Succesfully loaded %s into Campaign %s, <br>" % (fname.lstrip("./files/"), table)
print record - errors, "new records.<br>"
print errors, "errors.<br>"

编辑/更新:使用 LOAD DATA LOCAL INFILE 非常有效,我在不到一分钟内加载了 600K 条记录。

新代码也更简洁。

    else:
colnum.append([field, item])
sortlist = sorted(colnum, key=itemgetter(0))
cols = ''
for colname in sortlist:
cols = cols + "%s, " % colname[1]
cur.execute("LOAD DATA LOCAL INFILE '%s' IGNORE INTO TABLE %s FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (%s)" % (fname, table, cols.rstrip(', ')))
con.commit()

唯一的问题是我必须做更多的工作来准备我的 csv 文件以确保数据完整性,否则,工作就像一个魅力。

最佳答案

INSERT INTO,一次完成一行,考虑到某些 SQL(如 mySQL)支持在单个插入命令上有一堆行或可以将 CSV 文件快速读入服务器的 LOAD DATA 语句,这是相当慢的。

另请参阅:https://dba.stackexchange.com/questions/16809/why-is-load-data-infile-faster-than-normal-insert-statements

关于python - 为什么填充我的表需要这么长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10402340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com