使用python加速从txt文件向mySQL插入大数据集

时间:2014-03-19 02:40:43

标签: python mysql large-data

后台:我有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() 

3 个答案:

答案 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文件,将它们导入数据库。