python 데이터베이스 저장 속도가 너무 느린 문제 해결

문제


프로젝트에서 문제가 발생했습니다. 텍스트에서 3만 개의 데이터를 읽고 mysql 데이터베이스에 써야 합니다. 파일에서 @ 분할된 sql 문장으로 되어 있지만 읽는 과정에서 속도가 너무 느린 것을 발견했습니다. 3만 8천 개의 데이터는 220초가 걸렸습니다. 문제 코드 부분은 다음과 같습니다.

def read_to_mysql(filecata, targetDir):
 '''
  , 
 filecata  list, 
 :param filecata:  
 :param targetDir:  
 :return:
 '''
 root_dir = os.path.abspath(os.path.join(os.getcwd(), "./"))
 config = configparser.ConfigParser()
 config.read(root_dir + "/config.ini")
 __host = config.get("DatabaseOfWRT", "host")
 __database_name = config.get("DatabaseOfWRT", "database")
 __user_name = config.get("DatabaseOfWRT", "username")
 __user_passwaord = config.get("DatabaseOfWRT", "password")
 __charset = config.get("DatabaseOfWRT", "charset")
 conn = pymysql.connect(
  host=__host,
  user=__user_name, password=__user_passwaord,
  database=__database_name,
  charset=__charset
 )
 cursor = conn.cursor()
 with open(filecata, "r", encoding='utf-8') as f:
  data = f.read() #  
  data_list = data.split('@')
  del data_list[-1]
  starttime = int(time.time())
  for data_str in data_list:
   data_str = str(data_str)
   sql = data_str + ';'
   cursor.execute(sql)
   conn.commit()
   print(flag)
 copy_del_file(filecata, targetDir) #  , , 
 cursor.close()
 conn.close()

솔루션


테스트를 통해 속도에 영향을 주는 주요 원인은commit()인 것으로 나타났다. 몇 초가 지나지 않아 한 번 제출하면 되지만 제출한 문자의 길이가 제한되어 있기 때문에 합리적인 시간 읽기를 설정해야 한다. 코드 수정은 다음과 같다.

def read_to_mysql(filecata, targetDir):
 '''
  , 
 filecata  list, 
 :param filecata:
 :param targetDir:  
 :return:
 '''
 root_dir = os.path.abspath(os.path.join(os.getcwd(), "./"))
 config = configparser.ConfigParser()
 config.read(root_dir + "/config.ini")
 __host = config.get("DatabaseOfWRT", "host")
 __database_name = config.get("DatabaseOfWRT", "database")
 __user_name = config.get("DatabaseOfWRT", "username")
 __user_passwaord = config.get("DatabaseOfWRT", "password")
 __charset = config.get("DatabaseOfWRT", "charset")
 conn = pymysql.connect(
  host=__host,
  user=__user_name, password=__user_passwaord,
  database=__database_name,
  charset=__charset
 )
 cursor = conn.cursor()
 with open(filecata, "r", encoding='utf-8') as f:
  data = f.read() #  
  data_list = data.split('@')
  del data_list[-1]
  starttime = int(time.time())
  for data_str in data_list:
   endtime = int(time.time())
   data_str = str(data_str)
   sql = data_str + ';'
   cursor.execute(sql)
   if endtime - starttime ==10: #  
    starttime = int(time.time())
    conn.commit()
 conn.commit()
 copy_del_file(filecata, targetDir)
 cursor.close()
 conn.close()
 return flag
이때 3만 8천 개의 데이터를 기록하는 데 9초가 걸린다
추가:python 연결 데이터베이스cursur.fetchall () 속도가 느린 솔루션

커서가 느리게 흐르는 것을 해결하는 방법:


한 줄씩 한 줄씩 훑어보는 것이지, 한 번에 모두 읽는 것이 아니다
저주를 하다.fetchall () 에서 for i incursur로 변경:
추가:python 파일 읽기 속도 문제

"""   """
#  
with open('test.txt', 'r', encoding='utf-8') as f:
 info = f.readlines()
 for line in info:
 pass
#  
with open('test.txt', 'r', encoding='utf-8') as f:
 for line in f:
 pass
상기 두 가지 방식으로 파일을 읽는 데는 각자의 용도가 있다. 두 가지 방식으로 모두 할 수 있을 때 두 번째 방식의 효율은 첫 번째 몇 가지 양급이다.readlines()는 파일 내용을 메모리의list에 읽어서 조작은 편리하지만 메모리를 소모하고 운행 효율이 느리다.
원생 f는 파일 내용을 생성기에 읽는 것입니다. 작업이 필요할 때 생성기에서 순환되어 속도가 매우 빠릅니다. 큰 파일을 조작할 때 두 번째 방식을 권장합니다!
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기