Для будущих поисковиков: главный ответ здесь предлагает очистить элемент на каждой итерации, но это все равно оставляет вас с постоянно увеличивающимся набором пустых элементов, которые будут медленно нарастать в памяти:
for event, element in etree.iterparse(path_to_file, tag="BlogPost"):
for child in element:
print child.tag, child.text
element.clear()
^ Это не масштабируемое решение, тем более, что ваш исходный файл становится все больше и больше. Лучшее решение - получить элемент root и очистить , что каждый раз, когда вы загружаете полную запись. Это сохранит использование памяти довольно стабильно (суб-20MB, я бы сказал).
Вот решение, которое не требует поиска определенного тега. Эта функция возвращает генератор, который дает все узлы 1-го ребенка (например, <BlogPost>
) под корневым узлом (например, <Database>
). Это делается путем записи начала первого тега после корневого узла, затем ожидания соответствующего конечного тега, получения всего элемента, а затем очистки корневого узла.
from lxml import etree
xmlfile = '/path/to/xml/file.xml'
def iterate_xml(xmlfile):
doc = etree.iterparse(xmlfile, events=('start', 'end'))
_, root = next(doc)
start_tag = None
for event, element in doc:
if event == 'start' and start_tag is None:
start_tag = element.tag
if event == 'end' and element.tag == start_tag:
yield element
start_tag = None
root.clear()
Если вы ищете публичный API FCM для запланированного push или параметра полезной нагрузки, где вы можете установить дату push, к сожалению, на данный момент ничего подобного нет.
Вы должны реализовать свой собственный сервер приложений и реализовать запланированное нажатие самостоятельно (также упоминалось здесь здесь ).