Tôi đang phân tích cú pháp tệp JSON trên iPad có dung lượng khoảng 53 MB. Các phân tích đang làm việc tốt, tôi đang sử dụng Yajlparser mà là một phân tích cú pháp SAX và đã thiết lập nó như thế này:Mức tiêu thụ bộ nhớ lớn khi phân tích cú pháp JSON và tạo NSManagedObjects
NSData *data = [NSData dataWithContentsOfFile:path options:NSDataReadingMappedAlways|NSDataReadingUncached error:&parseError];
YAJLParser *parser = [[YAJLParser alloc] init];
parser.delegate = self;
[parser parse:data];
Tất cả mọi thứ đã làm việc tốt cho đến bây giờ, nhưng JSON-file trở nên lớn hơn và bây giờ tôi đột nhiên gặp cảnh báo bộ nhớ trên iPad 2. Nó nhận được 4 cảnh báo bộ nhớ và sau đó chỉ bị treo. Trên iPad 3 nó hoạt động hoàn hảo mà không có bất kỳ cảnh báo mem.
Tôi đã bắt đầu lược tả bằng Dụng cụ và tìm thấy rất nhiều phân bổ CFNumber (Tôi đã dừng các dụng cụ sau vài phút, tôi đã chạy nó trước khi tai nạn và điều CFNumber ở khoảng 60 mb trở lên).
Sau khi mở chi tiết CFNumber, nó xuất hiện một danh sách lớn các phân bổ. Một trong số đó chỉ cho tôi như sau:
và một số khác ở đây:
Vì vậy, những gì tôi làm sai? Và con số đó (ví dụ: 72,8% trong hình ảnh cuối cùng) là gì? Tôi đang sử dụng ARC nên tôi không thực hiện bất kỳ Bản phát hành hoặc Giữ lại hoặc bất kỳ điều gì.
Cảm ơn sự giúp đỡ của bạn. Cheers
EDIT: Tôi đã hỏi những câu hỏi về làm thế nào để phân tích các tập tin lớn như vậy ở đây: iPad - Parsing an extremely huge json - File (between 50 and 100 mb)
Vì vậy, các phân tích cú pháp riêng của mình có vẻ là tốt.
Con số này có nghĩa là 72,8% khả năng phần mã này đang gây ra vấn đề lớn mà bạn đang gặp phải. (phần lớn thời gian của nó chỉ hướng đúng, ngoại trừ một vài). Chỉ vì bạn đang sử dụng ARC, điều đó không có nghĩa là mã miễn phí/không bị lỗi 100%. Ví dụ, tham chiếu vòng tròn vẫn có thể gây rò rỉ trong mã của bạn. Hãy thử chạy bộ phân tích bộ nhớ và xem liệu "bộ nhớ ảo" của bạn có quá lớn không. Đăng thông tin phản hồi của bạn – nsuinteger
Từ những gì tôi hiểu CoreFoundation cố gắng giảm thiểu số lượng các đối tượng như số và chuỗi. Tài sản "kundennr" được định nghĩa là "bản sao" bởi bất kỳ cơ hội nào? Có vẻ như bạn có thể tạo bản sao mỗi khi bạn chỉ định thuộc tính đó và "currentWarengruppeVK". Điều đó sẽ phủ nhận hiệu quả tích hợp được cung cấp bởi CoreFoundation. – Saltymule
Một vấn đề tiềm năng với trình phân tích cú pháp YAJL là nó vượt qua NSObjects cho các giá trị JSON nguyên thủy (Chuỗi, Đúng, Sai, Số, Null). Nghĩa là, nội bộ nó phải phân bổ NSObjects cho điều đó. Có khả năng, các đối tượng này cũng sẽ được đưa vào một bể tự động. Một cách tiếp cận tốt hơn sẽ không phân bổ bất cứ điều gì để chuyển các giá trị nguyên thủy JSON tới đại biểu của trình phân tích cú pháp. Thông thường (như để tạo các đối tượng được quản lý bằng CD), điều này cũng không cần thiết. Các đối tượng được quản lý bằng CD sẽ tạo bản sao cho các thuộc tính của chúng. Nói tóm lại: IMO, YAJL có vẻ kém tối ưu cho vấn đề của bạn. – CouchDeveloper