Tôi đang cố gắng viết một số ứng dụng, thực hiện phân tích dữ liệu, được lưu trữ trong các tệp XML khá lớn (từ 10 đến 800MB). Mỗi bộ dữ liệu được lưu trữ dưới dạng một thẻ duy nhất, với dữ liệu cụ thể được chỉ định làm attrobutes. Tôi hiện đang saxParse từ HaXml, và tôi không hài lòng với việc sử dụng bộ nhớ trong khi làm việc với nó. Khi phân tích cú pháp tệp 15Mb XML, nó tiêu thụ hơn 1Gb bộ nhớ, mặc dù tôi đã cố gắng không lưu trữ dữ liệu trong danh sách và xử lý nó ngay lập tức. Tôi sử dụng đoạn mã sau:Trình phân tích cú pháp XML nào cho Haskell?
importOneFile file proc ioproc = do
xml <- readFile file
let (sxs, res) = saxParse file $ stripUnicodeBOM xml
case res of
Just str -> putStrLn $ "Error: " ++ str;
Nothing -> forM_ sxs (ioproc . proc . (extractAttrs "row"))
nơi 'proc' - thủ tục, mà thực hiện chuyển đổi dữ liệu từ thuộc tính vào thu âm, và 'ioproc' - thủ tục, mà thực hiện một số hành động IO - đầu ra cho màn hình, lưu trữ trong cơ sở dữ liệu, v.v.
Làm cách nào để giảm mức tiêu thụ bộ nhớ trong quá trình phân tích cú pháp XML? Có nên chuyển sang trình phân tích cú pháp XML khác không?
Cập nhật: và trình phân tích cú pháp nào hỗ trợ cho các mã hóa đầu vào khác nhau - utf-8, utf-16, utf-32, v.v ...?