Как быстро вставить Dict в базу данных SqlLite? - PullRequest
0 голосов
/ 28 мая 2018

У меня проблема с огромными данными Users.xml от Stackoverflow.Он имеет> 8 млн. Данных.У меня также есть posts.xml, который содержит огромное количество данных.

Users.xml = 2,49 ГБ

Posts.xml = 58,3 ГБ

Я покажу связь моего сценария снизу вверх.

Метод over создает таблицу, если она не существует, и insertStatement получает строку для оператора выполнения.

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 голосов
/ 30 мая 2018

Вместо создания нового соединения и курсора каждый раз, вы можете передать один курсор в функцию 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...