Tôi đang cố gắng nhập một lượng lớn dữ liệu vào kho dữ liệu cốt lõi trên iPhone. Tôi đang sử dụng bản sao lưu SQLite cho kho lưu trữ dữ liệu cốt lõi. Dường như nó có vẻ dài hơn tôi mong đợi. Tôi đã cắt bớt các thói quen để nó về cơ bản chỉ cố gắng lấy một đối tượng (để xem nếu nó đã tồn tại) và sau đó tạo một đối tượng mới nếu nó không (chúng không bao giờ làm vì tôi đang nhập dữ liệu). Tuy nhiên, việc tìm nạp không phải là phần mất thời gian. Đó là việc tạo ra các vật thể. Về cơ bản, mã vi phạm là:Làm cách nào để cải thiện hiệu suất của đối tượng Dữ liệu lõi chèn trên iPhone?
MobileObject *newObject = (MobileObject *)[NSEntityDescription insertNewObjectForEntityForName:objDesc inManagedObjectContext:managedObjectContext];
Tôi đã nhận thấy rằng trên trình mô phỏng, nó khá nhanh khi bắt đầu với khoảng 100 đối tượng được tạo thứ hai. Nó chậm lại mặc dù và bởi thời gian năm ngàn đối tượng được tạo ra nó gần như 2 giây cho 100 đối tượng và do thời gian mười nghìn đối tượng được tạo ra, nó là 4 giây cho mỗi 100 đối tượng. Toàn bộ nhóm 21000 đối tượng mất hơn 10 phút. Đó là với tất cả các mã hữu ích thực tế được lấy ra (đó chỉ là một tìm nạp và tạo một đối tượng). Và nó chậm hơn nhiều so với thiết bị thực tế (có thể gấp 4 lần).
Điều tôi không hiểu là lý do dữ liệu lõi bắt đầu nhanh nhưng sau đó bắt đầu chậm lại. Tôi đã thử cả với chỉ mục và không có chỉ mục trên dữ liệu của mình. Tôi đã thử tạo hồ bơi autorelease của riêng tôi mà tôi định kỳ cống trong vòng lặp của tôi. Tôi đã thử lưu sau mỗi lần tạo đối tượng. Tôi đã cố gắng chờ đến khi kết thúc để cứu. Nhưng dù tôi có làm gì đi chăng nữa, màn trình diễn vẫn có vẻ khốn khổ. Nó chỉ là chậm để thêm một đối tượng mới vào một kho dữ liệu cốt lõi với một vài nghìn đối tượng trong đó? Bất kỳ đề xuất?
Tôi nên nhận xét rằng thực sự tôi nghĩ rằng các lần tải là những người chiếm một lượng thời gian đáng kể. Tôi cho rằng điều đó có ý nghĩa vì cửa hàng lớn hơn, có nhiều đối tượng hơn để tìm kiếm. – Mike
Là một sang một bên, các diễn viên trong mã mẫu của bạn ở trên là không cần thiết. '-insertNewObjectForEntity ...' trả về một 'id' và do đó không và không nên bỏ. –
Tạo một cơ sở dữ liệu khổng lồ theo cách này có thể cực kỳ chậm nếu bạn đợi đến khi kết thúc để lưu. Nói chung tôi lưu sau mỗi vài nghìn đối tượng mới, chưa thử nghiệm để tìm tần số tối ưu. –