У меня 35,5 Мб .XLSM файла.Когда фактический используемый контент расширяется, он затопляет DOM-парсеры, такие как дерево элементов, исчерпывающее память после долгого и длительного времени работы.
Однако при использовании SAX-парсера ContentHandler
ограничивается накоплением строкво временном файле.Что немного раздражает, потому что синтаксический анализатор и основное приложение могут иметь простые сопутствующие отношения, где каждая строка, проанализированная SAX, может быть передана приложению.
Это не выглядиткак возможно следующее:
def gen_rows_from_xlsx( someFile ):
myHandler= HandlerForXLSX()
p= xml.sax.makeParser()
p.setContentHandler( myHandler, some_kind_of_buffer )
for row in some_kind_of_buffer.rows():
p.parse() # Just enough to get to the ContentHandler's "buffer.put()"
yield row
Периодически HandlerForXLSX
будет вызывать some_kind_of_buffer.put( row )
для помещения строки в буфер.Эта единственная строка должна быть получена через some_kind_of_buffer.rows()
.
Простые соотношения сопрограммы между парсером SAX и gen_rows_from_xslx()
были бы идеальными.
Я пропустил некоторую магию функции генератора, которая позволитмне упаковать SAX в качестве сопрограммы какой-то?
Является ли единственной альтернативой для создания потока синтаксического анализа SAX и использования Queue
для получения строк, созданных синтаксическим анализатором?
Или проще перекусить пулю и создать временный файлв парсере SAX и затем выдавать эти объекты через генератор?
Related: Ленивый парсер SAX XML с остановкой / возобновлением .