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는 파일 내용을 생성기에 읽는 것입니다. 작업이 필요할 때 생성기에서 순환되어 속도가 매우 빠릅니다. 큰 파일을 조작할 때 두 번째 방식을 권장합니다!
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.