Tôi có một tệp dữ liệu XML lớn (> 160M) để xử lý và có vẻ như phân tích cú pháp SAX/expat/pulldom là cách để đi. Tôi muốn có một luồng mà chuyển qua các nút và đẩy các nút được xử lý lên một hàng đợi, và sau đó các luồng công nhân khác kéo nút sẵn có tiếp theo ra khỏi hàng đợi và xử lý nó.Làm cách nào để xử lý xml không đồng bộ trong python?
tôi có như sau (cần có ổ khóa, tôi biết - nó sẽ, sau)
import sys, time
import xml.parsers.expat
import threading
q = []
def start_handler(name, attrs):
q.append(name)
def do_expat():
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = start_handler
p.buffer_text = True
print("opening {0}".format(sys.argv[1]))
with open(sys.argv[1]) as f:
print("file is open")
p.ParseFile(f)
print("parsing complete")
t = threading.Thread(group=None, target=do_expat)
t.start()
while True:
print(q)
time.sleep(1)
Vấn đề là cơ thể của khối while
được gọi chỉ một lần, và sau đó tôi không thể thậm chí ctrl-C cũng làm gián đoạn nó. Trên các tệp nhỏ hơn, đầu ra là như mong đợi, nhưng điều đó dường như chỉ ra rằng trình xử lý chỉ được gọi khi tài liệu được phân tích cú pháp đầy đủ, dường như đánh bại mục đích của trình phân tích cú pháp SAX.
Tôi chắc chắn đó là sự thiếu hiểu biết của riêng tôi, nhưng tôi không thấy nơi tôi đang phạm sai lầm.
PS: Tôi cũng đã cố gắng thay đổi start_handler
như sau:
def start_handler(name, attrs):
def app():
q.append(name)
u = threading.Thread(group=None, target=app)
u.start()
Không có tình yêu, mặc dù.
Đã bỏ phiếu cho các đề xuất Hàng đợi, nhưng bạn có chắc chắn về việc ParseFile nuốt chửng mọi thứ xuống một lần không? Nó gọi lại vào các trình xử lý Python để xử lý các thẻ khi nó đi, đó là toàn bộ mục đích của phân tích cú pháp SAX ... hay bạn đang nói điều đó là không đủ để kích hoạt một trình chuyển đổi luồng trong Python? –
Nếu bạn muốn SAX, bạn có thể sử dụng xml.sax, xem http://docs.python.org/library/xml.sax.html?highlight=sax#module-xml.sax; OP không sử dụng SAX, nhưng thay vì xml.parsers.expat, một giao diện trừu tượng thấp hơn mà không ** áp đặt một chiến lược gia tăng (nó _supports_ nó, nhưng không _impose_ nó, để nó lên đến mức mã Python để chọn và chọn). –
Sự lựa chọn của người nước ngoài là phần nào tùy ý, tôi không thể tìm thấy một lời giải thích tốt về sự khác biệt giữa người nước ngoài và sax. Các mô-đun sax hoạt động chỉ là tốt - thậm chí có lẽ tốt hơn, vì nó có vẻ là không đồng bộ như tôi cần thiết. Tôi vết thương lên việc áp dụng các "thức ăn nó một đoạn tại một thời gian" phương pháp anyway, vì nó mang lại cho tôi một cơ hội để khử trùng các chuỗi tôi ăn trước khi phân tích cú pháp được cho họ. Câu trả lời rất hữu ích, cảm ơn. – decitrig