【发布时间】: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