@toobinks

Как импортировать большой xml файла в PostgreSQL (sqlalchemy)?

Сейчас я делаю вот так:

class XmlHandler(ContentHandler):

    def startElement(self, name, attrs):
        if name == 'Objects':
            print('start')
        elif name == 'Object':
             self.obj = attrs['param]'

    def endElement(self, name):
        if name == 'Objects':
            print('end')
        elif name == 'Object':
             self.obj.save()

xml.sax.parse(xml_path, XmlHandler())


Что, естественно, очень медленно.
И соответствующие вопросы:
1. Как сделать быстрее?
2. Как вычислить какие операции конкретно этого участка кода забирает больше всего процессорного времени?
  • Вопрос задан
  • 534 просмотра
Пригласить эксперта
Ответы на вопрос 1
@toobinks Автор вопроса
Я как минимум не прав, что показал не всю реализацию метода.
В endElement в конце у меня был gc.collect()

Профайлер подсказал, что первая проблема в нём
pix.toile-libre.org/upload/original/1503120966.png

После
pix.toile-libre.org/upload/original/1503121255.png
поиск объекта в базе
class Obj(Model):
    id = Column(UUID, primary_key=True)

class XmlHandler(ContentHandler):
    def __init__(self):
        pass

    def startElement(self, name, attrs):
        if name == 'Objects':
            print('start parse')
        elif name == 'Object':
            aoid = attrs['ID']
            self.obj = Obj.query.filter_by(id=id).first() # это 2-ое узкое место
            if not self.obj:
                self.obj = Obj()


    def endElement(self, name):
        if name == 'Objects':
            print('end')
        elif name == 'Object':
        	self.obj.save()
        gc.collect() # это было 1-ое узкое место

xml.sax.parse(xml_path, XmlHandler())


Что можно с этим сделать?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы