これ (実際のコードから単純化したもの - 明確にするために、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
-それぞれ1つの「値」で構成される100個の「セル」と、それぞれ1つの「テキスト」で構成される100個の「共有文字列」Elements
、合計400個、4000回繰り返されます(つまり、1.6MElements
すべてアップ)。
これは 1 GB をはるかに超えるメモリを使用するため (実際には、実際には 4000 と 100 の数字をもっと大きくする必要があります)、おそらく要素あたり 600 バイト程度です。
私はetreeに精通していません-これをより効率的に(メモリ)実行できる方法はありますか?ツリーをいくつかの点で文字列にフラット化し、より大きなセグメントからツリーを再作成する方がよいでしょうか? それとも、ポイントで平らにして平らにしたままにする必要がありますか? (すべて完了したらファイルを生成しているので、作成する以外にツリー構造は必要ありません)。
(それが役立つ場合、およびスキーマから明らかでない場合、コードはxlsxファイルの一部を作成しています。明らかに、共有文字列構造が無意味であることをマイクロソフトに納得させることはできません)。
(Python 2.7、OS X、または Debian を使用)。