2009-04-07 85 views
5

Tôi đang làm việc với tệp XML 20 gig mà tôi muốn nhập vào cơ sở dữ liệu SQL (tốt hơn là MySQL, vì đó là những gì tôi quen thuộc). Điều này có vẻ như nó sẽ là một nhiệm vụ phổ biến, nhưng sau khi Googling xung quanh một chút tôi đã không thể tìm ra cách để làm điều đó. Cách tốt nhất để làm việc này là gì?Nhập XML vào cơ sở dữ liệu SQL

Tôi biết khả năng này được tích hợp vào MySQL 6.0, nhưng đó không phải là tùy chọn ngay bây giờ vì nó là bản phát hành alpha.

Ngoài ra, nếu tôi phải làm bất kỳ tập lệnh nào tôi thích sử dụng Python vì đó là những gì tôi quen thuộc nhất.

Cảm ơn.

Trả lời

1

Tôi đã thực hiện điều này nhiều lần với Python, nhưng không bao giờ có một tệp XML lớn như vậy. ElementTree là một thư viện XML tuyệt vời cho Python có thể hỗ trợ. Nếu có thể, tôi sẽ chia XML thành các tệp nhỏ hơn để dễ dàng tải vào bộ nhớ và phân tích cú pháp.

+1

Trình phân tích SAX rất hữu ích để chia nhỏ tệp XML thành nhiều phần. –

4

Bạn có thể sử dụng hàm getiterator() để lặp qua tệp XML mà không cần phân tích cú pháp toàn bộ nội dung cùng một lúc. Bạn có thể làm điều này với ElementTree, được bao gồm trong thư viện chuẩn hoặc với lxml.

for record in root.getiterator('record'): 
    add_element_to_database(record) # Depends on your database interface. 
            # I recommend SQLAlchemy. 
0

Đây có thể là một nhiệm vụ phổ biến, nhưng có thể 20GB không phổ biến với MySQL như với SQL Server.

Tôi đã thực hiện việc này bằng Dịch vụ tích hợp SQL Server và một chút mã tùy chỉnh. Cho dù bạn cần một trong số đó phụ thuộc vào những gì bạn cần làm với 20GB XML trong cơ sở dữ liệu. Nó sẽ là một cột đơn của một hàng duy nhất của một bảng? Một hàng cho mỗi phần tử con?

Máy chủ SQL có kiểu dữ liệu XML nếu bạn chỉ muốn lưu trữ XML dưới dạng XML. Loại này cho phép bạn thực hiện các truy vấn bằng XQuery, cho phép bạn tạo các chỉ mục XML trên XML và cho phép cột XML được "gõ mạnh" bằng cách tham chiếu đến một tập hợp các lược đồ XML mà bạn lưu trữ trong cơ sở dữ liệu.

+0

Tôi thực sự muốn loại bỏ XML và chỉ lưu trữ dữ liệu dưới dạng cột được đặt tên thích hợp. Đó là một định dạng khá đơn giản (tài liệu từ trang nội dung công khai có API tải xuống). –

2

Hãy nhìn vào các iterparse() chức năng từ ElementTree hoặc cElementTree (tôi đoán cElementTree sẽ là tốt nhất nếu bạn có thể sử dụng nó)

mảnh này mô tả nhiều hơn hoặc ít hơn những gì bạn cần làm: http://effbot.org/zone/element-iterparse.htm#incremental-parsing

này có lẽ sẽ là cách hiệu quả nhất để làm điều đó trong Python. Đảm bảo không quên gọi số .clear() trên các phần tử thích hợp (bạn thực sự không muốn tạo cây nhớ trong tệp xml 20gig: phương pháp .getiterator() được mô tả trong câu trả lời khác đơn giản hơn, nhưng không yêu cầu toàn bộ cây đầu tiên - Tôi giả định rằng áp phích thực tế cũng có ý tưởng là iterparse())

0

Hình MySQL documentation dường như không chỉ ra rằng nhập XML bị giới hạn ở phiên bản 6. Nó dường như cũng hoạt động với 5.

Các vấn đề liên quan