如何快速将Dict插入SqlLite数据库?

时间:2018-05-27 21:32:19

标签: python xml database python-3.x sqlite

Stackoverflow中的Users.xml大数据存在问题。它具有> 8mill Data。 我还有posts.xml包含大量数据。

Users.xml = 2,49 GB

Posts.xml = 58,3 GB

我将从底部到顶部显示我的脚本的通信。

如果不存在,则over方法创建表,并且inserStatement获取执行语句的String。

def savingDataToDatabase(tableName, element):
    createTable(tableName)
    connection = sqlite3.connect("database.db", isolation_level=None)
    c = connection.cursor() 

    if(tableName == "Users"):
        insertStatement = sqlInsertStatement(tableName)
        c.execute(insertStatement,([element["AccountId"], element["Reputation"], element["CreationDate"], element["CreationTime"], element["DisplayName"], element["LastAccessDate"], element["WebsiteUrl"], element["Location"], element["AboutMe"], element["Views"], element["UpVotes"], element["DownVotes"], element["Age"]]))
        connection.commit()
connection.close()

processingUsersXML(element)返回带有预处理数据的Dict。

def processingDataForSQL(filename, element):
    if filename == 'Users':
        user = processingUsersXML(element)
        savingDataToDatabase(filename, user)

def getDataFromXml(filename):
    for evt, elem in iterparse('/../usws/stackoverflowDataScience/dumpData/'+str(filename)+'.xml', events=('end',)):
        if elem.tag == 'row':
            element_fields = elem.attrib
            processingDataForSQL(filename, element_fields)
            elem.clear()

def chosenXMLFile():
    getDataFromXml('Users')
    getDataFromXml('Posts')


chosenXMLFile()

我希望你们能提供帮助。这需要花费很多时间。它有效,但它很慢。我没有找到任何帮助我的帖子。我看过一篇文章,但它并没有真正帮助我,如果你能通过我的代码向我展示我可以修改它,我将不胜感激。

最好的问候

JoshED

1 个答案:

答案 0 :(得分:0)

不是每次都创建一个新的连接和光标,而是可以将一个光标传递给savingDataToDatabase函数:

def savingDataToDatabase(tableName, element, cursor):
    if tableName == 'Users':
        insertStatement = sqlInsertStatement(tableName)
        cursor.execute(insertStatement,([element["AccountId"], element["Reputation"], element["CreationDate"], element["CreationTime"], element["DisplayName"], element["LastAccessDate"], element["WebsiteUrl"], element["Location"], element["AboutMe"], element["Views"], element["UpVotes"], element["DownVotes"], element["Age"]]))

def processingDataForSQL(filename, element, cursor):
    if filename == 'Users':
        user = processingUsersXML(element)
        savingDataToDatabase(filename, user, cursor)

def getDataFromXml(filename):
    tableName = filename
    createTable(tableName)
    connection = sqlite3.connect("database.db", isolation_level=None)
    cursor = connection.cursor()
    for evt, elem in iterparse('/../usws/stackoverflowDataScience/dumpData/'+str(filename)+'.xml', events=('end',)):
        if elem.tag == 'row':
            element_fields = elem.attrib
            processingDataForSQL(filename, element_fields, cursor)
            elem.clear()
    connection.commit()
    connection.close()

def chosenXMLFile():
    getDataFromXml('Users')
    getDataFromXml('Posts')

chosenXMLFile()