Tôi đang mã hóa trình phân tích cú pháp XML bằng libxml2. Trên thực tế, tôi đã hoàn thành nó nhưng có một vấn đề khá khó chịu của bộ nhớ. Chương trình đầu tiên nhận được một số liên kết từ cơ sở dữ liệu của tôi và tất cả các liên kết đó trỏ đến một tệp XML. Tôi sử dụng curl để tải chúng xuống. Quá trình này rất đơn giản: tôi tải xuống một tệp, sau đó tôi phân tích cú pháp, v.v ...Rò rỉ bộ nhớ lớn với libxml2
Vấn đề có vẻ là khi phân tích xong. Curl tải xuống tệp tiếp theo nhưng dường như XML trước đó không được giải phóng, vì tôi đoán libxml2 tải nó trong RAM. Khi phân tích cú pháp XML cuối cùng, tôi thấy bản thân bị rò rỉ ~ 2.6GB (vâng, một số tệp này thực sự lớn ...) và máy của tôi chỉ có 4GB RAM. Nó hoạt động cho thời điểm này, nhưng trong tương lai, nhiều liên kết sẽ được thêm vào cơ sở dữ liệu, vì vậy tôi phải sửa nó ngay bây giờ.
Mã của tôi là rất cơ bản:
xmlDocPtr doc;
doc = xmlParseFile("data.xml");
/* code to parse the file... */
xmlFreeDoc(doc);
Tôi đã cố gắng sử dụng:
xmlCleanupParser();
nhưng doc nói: "Nó không deallocate bất kỳ bộ nhớ tài liệu liên quan" (http://xmlsoft.org/html/libxml-parser.html#xmlCleanupParser)
Vì vậy, câu hỏi của tôi là: Có ai biết cách xử lý tất cả tài liệu liên quan đến bộ nhớ này không?
Nếu bạn đang tải các tập tin lớn vào bộ nhớ, tôi không hiểu lý do tại sao bạn nên ngạc nhiên khi sử dụng bộ nhớ khổng lồ. libxml2 là một đoạn mã được kính trọng sử dụng bởi nhiều hệ thống phần mềm quan trọng, tôi rất nghi ngờ có một "rò rỉ bộ nhớ lớn" với việc sử dụng chính xác libxml2. – carlosdc
Làm thế nào để bạn biết có rò rỉ bộ nhớ? Có lẽ đo lường của bạn là thiếu sót ... Lưu ý rằng số liệu thống kê bộ nhớ có thể đặc biệt khó giải thích một cách chính xác. – rodrigo
Hãy thử chạy nó dưới valgrind, nó báo cáo nơi bộ nhớ chưa phân bổ được cấp phát. –