优化执行SQL的Python脚本

2024-06-17 14:00:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,它从csv文件中解析信息并执行SQL语句来创建一个表并插入数据。我必须解析一个约25gb的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[:])

我可能会因为每次与insertm()的连接速度过慢而影响到数据库的创建速度?在


Tags: 文件ofcsvtoin脚本sourcefor
2条回答

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])

连接到数据库并为每一行创建一个游标。如果你把这一步移出循环,它会快得多。在

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

相关问题 更多 >