Bạn sẽ đọc một tệp XML bằng cách sử dụng sax và chuyển đổi nó thành phần tử lxml etree.iterparse như thế nào?Python sax để lxml cho 80 + GB XML
Để cung cấp tổng quan về vấn đề, tôi đã xây dựng một công cụ nhập XML bằng cách sử dụng lxml cho nguồn cấp dữ liệu XML có kích thước 25 - 500MB cần nhập trên cơ sở hai ngày, nhưng cần thực hiện một lần nhập một tệp có dung lượng từ 60 - 100GB.
Tôi đã chọn sử dụng lxml dựa trên các thông số chi tiết một nút sẽ không vượt quá kích thước 4 -8 GB mà tôi nghĩ sẽ cho phép nút được đọc vào bộ nhớ và xóa khi hoàn tất.
Tổng quan nếu mã dưới
elements = etree.iterparse(
self._source, events = ('end',)
)
for event, element in elements:
finished = True
if element.tag == 'Artist-Types':
self.artist_types(element)
def artist_types(self, element):
"""
Imports artist types
:param list element: etree.Element
:returns boolean:
"""
self._log.info("Importing Artist types")
count = 0
for child in element:
failed = False
fields = self._getElementFields(child, (
('id', 'Id'),
('type_code', 'Type-Code'),
('created_date', 'Created-Date')
))
if self._type is IMPORT_INC and has_artist_type(fields['id']):
if update_artist_type(fields['id'], fields['type_code']):
count = count + 1
else:
failed = True
else:
if create_artist_type(fields['type_code'],
fields['created_date'], fields['id']):
count = count + 1
else:
failed = True
if failed:
self._log.error("Failed to import artist type %s %s" %
(fields['id'], fields['type_code'])
)
self._log.info("Imported %d Artist Types Records" % count)
self._artist_type_count = count
self._cleanup(element)
del element
Hãy cho tôi biết nếu tôi có thể thêm bất kỳ loại làm rõ.
Vậy câu hỏi là gì? Bạn có nhận được thông báo lỗi không? –
Câu hỏi đặt ra trong câu đầu tiên ... tại sao câu trả lời là? – Nick
Câu hỏi của bạn hơi lạ. Tại sao bạn sử dụng SAX? iterparse là * một thay thế cho * SAX. Bạn có thể tạo các sự kiện lặp lại từ các sự kiện SAX, nhưng tại sao mọi người lại làm điều đó? –