0

这(从真实代码中简化 - 需要明确的是,我并没有真正创建 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 个“共享字符串”由一个“文本”组成,总共 400Elements个,重复 4000 次(所以1.6MElements全部增加)。

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

我对 etree 不太熟悉 - 有什么方法可以更有效地做到这一点(记忆)?将树在点处展平成字符串然后从更大的段重新创建树会更好吗?或者我是否需要将其压平并使其变平?(当它完成后我正在生成一个文件,所以除了创建它之外我不需要树结构)。

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

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

4

1 回答 1

2

对于写出 xml,有时将 xml 作为文本字符串写出更容易、更快捷。这样,您不必先在内存中构建整个事物。

于 2013-07-02T22:55:45.340 回答