是否有一种以内存效率的方式来创建数百万个etree.ElementTree对象?

时间:2013-07-02 22:45:01

标签: python xml memory elementtree

这(从实际代码中简化 - 要清楚,我实际上并没有创建4000个相同的行,或者100个相同的单元格)会迅速消耗内存:

import xml.etree.ElementTree

rows = []
shared_strings = []
for row_number in xrange(1, 4000):
    row = xml.etree.ElementTree.Element('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}row', {'r': str(row_number), 'spans': '1:100'})
    for column_number, value in enumerate("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~abcdefg"):
        attrib = {'r': 'A%s' % row_number, 't': 's'}
        c = xml.etree.ElementTree.Element('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}c', attrib)
        ss = xml.etree.ElementTree.Element('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}si')
        sst = xml.etree.ElementTree.Element('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}t')
        sst.text = value
        ss.append(sst)
        shared_strings.append(ss)
        v = xml.etree.ElementTree.Element('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}v')
        v.text = "4001"
        c.append(v)
        row.append(c)
    rows.append(row)

基本上,我正在创建一堆嵌套的Elements - 100'单元格',每个单元格由一个'值'和100'共享字符串'组成,每个单元由一个'text'组成,总共400 Elements,重复4000次(所有1.6M Elements)。

这使用了超过GB的内存(实际上我实际上需要4000和100的数字更大),所以每个元素大概600个字节。

我对etree并不熟悉 - 有哪些方法可以更有效地完成这项工作(内存)?将树在点处展平为字符串然后从较大的段重新创建树是否更好?或者我是否需要将其压平并使其变平? (当我完成所有文件时,我正在生成一个文件,所以我不需要树结构而不是创建它。)

(如果它有帮助,并且如果从模式中不明显,代码正在创建一个xlsx文件。显然我没有能力说服Microsoft共享字符串结构是没有意义的。)

(使用Python 2.7,OS X或Debian)。

1 个答案:

答案 0 :(得分:2)

对于写出xml,有时候,将xml写成文本字符串会更容易,也更快捷。这样,您就不必先在内存中构建整个内容。