有没有一种有效的方法来创造数百万的etree.ElementTree目录树物体?

2024-09-25 00:20:39 发布

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

这(从实际代码简化而来-要清楚,我并不是真的创建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个“共享字符串”每个由一个“文本”组成,总共400个Elements,重复了4000次(总共160万个)。你知道吗

这会占用超过1 GB的内存(实际上,我需要4000和100的数字更大),所以每个元素可能需要600字节左右。你知道吗

我对etree不是很熟悉-有没有什么方法可以更有效地完成这个任务(内存)?最好将树在点处展平成一条线,然后从更大的段重新创建树?或者我需要在点上压平它,让它压平?(我正在生成一个文件,当它全部完成,所以我不需要任何树结构,除了创建它)。你知道吗

(如果有帮助的话,如果从模式中看不明显,代码将创建一个xlsx文件的片段。显然,我无法说服微软,共享字符串结构是毫无意义的)。你知道吗

(使用Python2.7、OSX或Debian)。你知道吗


Tags: 内存orghttpnumbermainxmlelementschemas