后台:我有500个格式化的* .txt文件,我需要插入到mysql数据库中。目前我有一个python脚本来逐行读取文件并插入到mySQL数据库中。
问题:文件非常大(每个txt文件约100M),我测试了脚本,只需要将一个文件插入数据库就需要很长时间。
如何通过修改脚本加快进程?
代码:
for file in os.listdir(INPUTFILEPATH):
## index += 1
## print "processing %s out of %s files " % (index, totalfiles)
inputfilename = INPUTFILEPATH + "/" + file
open_file = open(inputfilename, 'r')
contents = open_file.readlines()
totalLines = len(contents)
## index2 = 0
for i in range(totalLines):
## index2 +=1
## print "processing %s out of %s lines " % (index2, totalLines)
lineString = contents[i]
lineString = lineString.rstrip('\n')
values = lineString.split('\t')
if ( len(re.findall(r'[0123456789_\'\.]',values[0])) > 0 ):
continue
message = """INSERT INTO %s(word,year,count,volume)VALUES('%s','%s','%s','%s')"""% ('1gram', values[0],values[1],values[2],values[3])
cursor.execute(message)
db.commit()
cursor.close()
db.close()
答案 0 :(得分:3)
需要考虑两个选项:
1)最简单的方法是在一个插入上包含多行值。这样做比做多个indsert更快。
做INSERT INTO tbl ( cols ) VALUES ( vals )
的内容,做INSERT INTO tbl ( cols ) VALUES ( vals ), ( vals ), ( vals )
您可以一次插入的行数取决于mysql服务器的最大数据包大小,但您可以安全地执行100,1000或10000行,它应该会使性能提高一个数量级或更多。
请参阅http://dev.mysql.com/doc/refman/5.5/en/insert-speed.html
2)LOAD DATA INFILE有点不同,需要更多工作并有自己的要求,但速度非常快。
答案 1 :(得分:1)
你在ram中存储了太多文本。你应该使用这样的缓冲区来做到这一点:
with open(inputfilename, 'r') as f:
for lineString in f:
... do your thing
答案 2 :(得分:0)
试试这个:
处理txt文件并为每一行生成INSERT命令。文件完成处理后,你有所有txt的.sql文件,将它们导入数据库。