【问题标题】:Is there a memory-efficient way to create millions of etree.ElementTree objects?有没有一种内存高效的方法来创建数百万个 etree.ElementTree 对象?
【发布时间】:2013-07-02 22:45:01
【问题描述】:

这(从真实代码简化 - 需要明确的是,我并没有真正创建 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 次(所以 1.6M Elements 全部加起来)。

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

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

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

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

【问题讨论】:

  • 为什么需要重复 4000+ 次?
  • @RobWatts 因为电子表格中有超过 4000 行。

标签: python xml memory elementtree


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多