的Python:这有什么错我的多进程插入到MySQL的代码?(Python : What's

2019-10-18 10:27发布

我已经写一个Python脚本插入一些数据(300百万)到MySQL表:

#!/usr/bin/python

import os
import MySQLdb

from multiprocessing import Pool

class DB(object):

  def __init__(self):
    self.conn = MySQLdb.connect(host='localhost',user='root',passwd='xxx',db='xdd',port=3306)
    self.cur = self.conn.cursor()

  def insert(self, arr):
    self.cur.execute('insert into RAW_DATA values(null,%s,%s,%s,%s,%s,%s,%s)', arr)

  def close(self):
    self.conn.commit()
    self.cur.close()
    self.conn.close()


def Import(fname):
  db = DB()

  print 'importing ', fname
  with open('data/'+fname, 'r') as f:

    for line in f:
      arr = line.split()
      db.insert(arr)

  db.close()


if  __name__ == '__main__':
  # 800+ files
  files = [d for d in os.listdir('data') if d[-3:]=='txt']

  pool = Pool(processes = 10)
  pool.map(Import, files)

问题是,脚本运行速度非常非常慢,有没有的利用多重的任何明显的错误?

Answer 1:

是的,如果你是批量插入3个亿行插入同一个表,那么你不应该尝试这种并行插入。 所有刀片都必须经过同样的瓶颈:更新索引,并写入到硬盘上的物理文件。 这些操作需要对底层资源的独占访问(索引,或盘头)。

你实际上是将现在有处理多个并发事务对数据库的一些无用开销。 这会消耗内存,强制上下文切换,使周围所有的时间,磁盘读取头跳跃,等等。

插入在同一个线程的一切。


它看起来像你实际上是由一种CSV文件的导入数据。 您可能需要使用内置的LOAD DATA INFILE MySQL命令,专为这个目的。 如果您需要调整此命令的一些帮助,请描述你的源文件。



文章来源: Python : What's wrong with my code of multi processes inserting to MySQL?