这(从真实代码中简化 - 需要明确的是,我并没有真正创建 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)。