这(从实际代码简化而来-要清楚,我并不是真的创建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次(总共160万个)。你知道吗
这会占用超过1 GB的内存(实际上,我需要4000和100的数字更大),所以每个元素可能需要600字节左右。你知道吗
我对etree不是很熟悉-有没有什么方法可以更有效地完成这个任务(内存)?最好将树在点处展平成一条线,然后从更大的段重新创建树?或者我需要在点上压平它,让它压平?(我正在生成一个文件,当它全部完成,所以我不需要任何树结构,除了创建它)。你知道吗
(如果有帮助的话,如果从模式中看不明显,代码将创建一个xlsx文件的片段。显然,我无法说服微软,共享字符串结构是毫无意义的)。你知道吗
(使用Python2.7、OSX或Debian)。你知道吗
对于编写xml,有时将xml编写为文本字符串更容易、更快。这样,你就不必先在内存中构建整个东西。你知道吗
相关问题 更多 >
编程相关推荐