什么减缓解析?

时间:2018-03-27 11:44:28

标签: python postgresql

我要解析大的XML文件(大约200k行和10MB)。结构如下:

<el1>
    <el2>
        <el3>
            <el3-1>...</el3-1>
            <el3-2>...</el3-2>
        </el3>
        <el4>
            <el4-1>...</el4-1>
            <el4-2>...</el4-2>
        </el4>
        <el5>
            <el5-1>...</el4-1>
            <el5-2>...</el5-2>
        </el5>
    </el2>
</el1>

这是我的代码:

tree = ElementTree.parse(filename)
doc = tree.getroot()

cursor.execute(
    'INSERT INTO first_table() VALUES()',
    ())

cursor.execute('SELECT id FROM first_table ORDER BY id DESC limit 1')
row = cursor.fetchone()
v_id1 = row[0]

for el1 in doc.findall('EL1'):
    cursor.execute(
        'INSERT INTO second_table() VALUES(v_id1)',
        (v_id1))

    cursor.execute(
        'SELECT id FROM second_table ORDER BY id DESC limit 1')
    row = cursor.fetchone()
    v_id2 = row[0]

    for el2 in el1.findall('EL2'):
        cursor.execute(
            'INSERT INTO third_table(v_id2) VALUES()',
            (v_id2))

        cursor.execute(
            'SELECT id FROM third_table ORDER BY id DESC limit 1')
        row = cursor.fetchone()
        v_id3 = row[0]

        for el3 in el2.findall('EL3'):
            cursor.execute(
                'INSERT INTO fourth_table(v_id3) VALUES()',
                (v_id3))

            cursor.execute(
                'SELECT id FROM fourth_table ORDER BY id DESC limit 1')
            row = cursor.fetchone()
            v_id4 = row[0]

            for el4 in el3.findall('EL4'):
                cursor.execute(
                    'INSERT INTO fifth_table(v_id4) VALUES()',
                    (v_id4))

            for el5 in el4.findall('EL5'):
                cursor.execute(
                    'INSERT INTO sixth_table(v_id4) VALUES()',
                    (v_id4))

                cursor.execute(
                    'SELECT id FROM sixth_table ORDER BY id DESC limit 1')
                row = cursor.fetchone()
                v_id5 = row[0]

                ...
conn.commit()

基本上我从属性中获取值并将它们发送到数据库中。当我需要处理嵌套元素时,我必须从数据库中选择SELECT最后插入的ID,并将其作为外键插入到下一个INSERT语句中。

整个过程大约需要50秒,但显然我的数据太长了。 SELECT语句肯定需要一些时间,但我已经在最后一行只选择了一个属性。

我不知道它是否会更快,因为我不擅长编程,所以我问你们。

1 个答案:

答案 0 :(得分:0)

你有4个嵌套for循环。这就是原因。它是O(n ^ 4)。