优化执行SQL的Python脚本

时间:2013-10-31 12:05:24

标签: python sql

我有一个脚本可以解析csv文件中的信息并执行SQL语句来创建表并插入数据。我必须解析一个~25 GB的csv文件,但是根据我目前的脚本,我估计从我解析过的以前大小的文件开始可能需要长达20天的时间。有关如何优化我的脚本以使其运行更快的任何建议?我遗漏了createtable函数,因为它只被调用一次。 InsertRow()是我认为我真的需要更快的功能。提前谢谢。

#Builds sql insert statements and executes sqlite3 calls to insert the rows 
def insertRow(cols):
    first = True; #First value for INSERT arguments doesn't need comma front of it.
    conn = sqlite3.connect('parsed_csv.sqlite')
    c = conn.cursor()
    print cols
    insert = "INSERT INTO test9 VALUES("
    for col in cols:
        col = col.replace("'", "")
        if(first):
            insert +=  "'" + col + "'"
            first = False;
        else:
            insert += "," + "'" + col+ "'" + " "
    insert += ")"
    print (insert)
    c.execute(insert)
    conn.commit()


def main():
    #Get rid of first argument (filename)
    cmdargs = sys.argv[1:]
    #Convert values to integers
    cmdargs = list(map(int, cmdargs))

    #Get headers
    with open(r'requests_fields.csv','rb') as source:
        rdr = csv.reader(source)
        for row in rdr:          
             createTable(row[:], cmdargs[:])

    with open(r'test.csv','rb') as source:
        rdr= csv.reader( source )
        for row in rdr:
            #Clear contents of list
            outlist =[]
            #Append all rows onto list and then write to row in output csv file
            for index in cmdargs:
                outlist.append(row[index])
            insertRow(outlist[:])

我遇到的慢速可能是因为每次在insertRow()中创建一个连接数?

2 个答案:

答案 0 :(得分:1)

您正在连接数据库并为每一行创建游标。如果你将这一步移到循环之外,它将会快得多。

你也是在每一行之后提交的。如果它符合您的应用程序的逻辑,我建议也尝试降低发生这种情况的频率,尽管在另一个极端情况下,在一次提交中执行整个25GB文件可能有其自身的问题。

答案 1 :(得分:1)

1)Python,SQLLite,25 GB。 Fastspeed =太棒了。

2) insert =“INSERT INTO test9 VALUES(” - 这是错误的解决方案。好的风格是using parameters

insert = "INSERT INTO test9 (field1, field2, field3) VALUES(?, ?, ?)"
c.execute(insert, [value1, value2, value3])