Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么填充我的表需要这么长时间?_Python_Mysql_Cgi - Fatal编程技术网

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

Python 为什么填充我的表需要这么长时间?,python,mysql,cgi,Python,Mysql,Cgi,我正在通过web表单将csv文件加载到我的数据库中 在每个csv文件中,原始数据的顺序是一致的,但根据源的不同,每个文件的顺序会有所不同,因此我有一个预览表单,其中显示了五行,并允许您通过表中有效列名的下拉列表指定一列 然后,我使用cgi表单构建一个INSERT语句,并逐行解析csv文件以填充表 但它的运行速度非常慢。我同时填充了两个表,一个表有961402行(7列带值),另一个表有1835538行(1列带值),每个表都运行了至少半个小时。我每秒只看到大约100行新的数据 你能看到这里有什么能让

我正在通过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>"

唯一需要注意的是,我必须做更多的工作来准备我的csv文件以确保数据的完整性,否则,工作会很有魅力

INSERT INTO一次只执行一行,速度非常慢,因为有些SQL(如mySQL)支持在单个INSERT命令中使用一堆行,或者加载可以将CSV文件快速读入服务器的数据语句


另请参见:

一些快速伪代码。这样做:

for row in data_to_be_inserted:
    stmt = compose_statement("lalala")
    cursor.execute()

connection.commit()
不是


您的代码commit()每行输入一次。这会大大降低速度。

请删除行号,因为行号只会使操作更加困难。将sql查询插入到大型表中可能是一个非常缓慢的操作。尝试创建一个满是INSERT INTOs的文件,并通过sql客户机手动运行它,看看我的意思。这就是我的想法,@paul,但这么慢?在这两者之间,每秒有200条记录似乎在爬行。有没有办法加快速度?这些列都是CHAR数据类型。听起来不错。如果表上有索引,则必须在写入时对其进行维护,因此写入时间越长,表中的行越多。您可能应该使用
executemany
,将所有行作为参数传递,然后提交整个插入。看看这里的一个例子。在你上面的评论之后,我开始研究mysqlimport。我想我可以像现在一样构建列名,然后一次导入csv文件。我补充说,由于处理时间的原因,我遇到了一个问题,apache花了很长时间才放弃服务页面。有了额外的提交,它就会持续存在。
for row in data_to_be_inserted:
    stmt = compose_statement("lalala")
    cursor.execute()

connection.commit()
for row in data_to_be_inserted:
    stmt = compose_statement("lalala")
    cursor.execute()
    connection.commit()