这(从实际代码中简化 - 要清楚,我实际上并没有创建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'共享字符串'组成,每个单元由一个'text'组成,总共400 Elements
,重复4000次(所有1.6M Elements
)。
这使用了超过GB的内存(实际上我实际上需要4000和100的数字更大),所以每个元素大概600个字节。
我对etree并不熟悉 - 有哪些方法可以更有效地完成这项工作(内存)?将树在点处展平为字符串然后从较大的段重新创建树是否更好?或者我是否需要将其压平并使其变平? (当我完成所有文件时,我正在生成一个文件,所以我不需要树结构而不是创建它。)
(如果它有帮助,并且如果从模式中不明显,代码正在创建一个xlsx文件。显然我没有能力说服Microsoft共享字符串结构是没有意义的。)
(使用Python 2.7,OS X或Debian)。
答案 0 :(得分:2)
对于写出xml,有时候,将xml写成文本字符串会更容易,也更快捷。这样,您就不必先在内存中构建整个内容。