2010-08-24 19 views
5

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?

+0

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

+0

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ỏ. –

+1

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. –

Trả lời

0

Thử sử dụng Thiết bị. Bạn không lưu sau khi chèn từng đối tượng? Trên thực tế, nhiều mã và chương trình liên quan đến chèn có thể rất hữu ích.

2

Nó có thể khá nhanh nhưng nó phụ thuộc vào những gì bạn đang làm. Như những người khác đã đề nghị bạn nên nhìn vào dụng cụ và tìm điểm nóng thực tế. Ngoài ra, việc đăng mã thực tế sẽ giúp xác định vấn đề.

+0

Đối với tôi, tôi * đang sử dụng Instruments và nó cho tôi biết _sharedIMPL_addObjectToSet_core chiếm 99% thời gian - theo lượt người quan sát giá trị quan trọng của NSObject mất 50% và _PF_ManagedObject_DidChangeValueForKeywithSetMutation mất 50% còn lại.Tôi đang kết nối mối quan hệ nhiều-nhiều giữa hàng nghìn thực thể "Câu" - đây là những bản dịch của nhau. Ngay cả sau khi thử một số tối ưu hóa, thủ phạm chậm thực sự là mối quan hệ "chèn" có khả năng xảy ra đằng sau hậu trường trong CoreData. Tôi chỉ có được cảm giác rằng điều này sẽ nhận được ít nhất 50% nhanh hơn nếu sử dụng sqlite trực tiếp :-P – Jonny

+0

SQLite nhanh hơn dữ liệu lõi. Dữ liệu cốt lõi sẽ không phải là nhanh nhất, nó là duy trì nhất. Đối với công cụ, ẩn thư viện hệ thống, làm phẳng đệ quy và đảo ngược cây cuộc gọi. Sau đó xem những gì trên đầu trang là ** mã ** CỦA BẠN. Đó là những gì bạn cần sửa. Khi bạn tìm thấy phương pháp đó là của bạn, nhấp đúp chuột vào nó và Instruments sẽ cho bạn thấy những gì là chậm * bên trong * của phương pháp đó. –

+0

Đó chính xác là những gì tôi đã làm. Tôi đào sâu vào chức năng của tôi, trong đó có một vòng lặp của một vài trăm nghìn mối quan hệ nhiều-nhiều, chỉ với một thực thể - có những câu đó là bản dịch của nhau. Tôi đã nghĩ rằng các NSDictionaries trung gian mà tôi sử dụng cho dữ liệu nguồn chậm với việc lập chỉ mục và tôi đã làm một số tối ưu ở đó, nhưng cụ cho thấy rõ ràng rằng vấn đề không phải là về NSDictionary, chỉ là các hoạt động chèn bên trong. Mà thực sự sử dụng sqlite cuối cùng. Lần cuối cùng tôi thử Core Data, tôi cũng gặp vấn đề với hiệu năng quá chậm và chỉ sử dụng Sqlite. – Jonny

0

Tôi cũng gặp sự cố này. Tôi đang nhập 100.000 đối tượng đơn giản từ kho lưu trữ dữ liệu từ xa và đã theo dõi ghi chú của Apple về việc nhập theo lô. Một vài lô đầu tiên (trong số 2000 đối tượng mỗi lô) bắt đầu hợp lý, và sau đó tiết kiệm chậm để thu thập thông tin.

Tôi đã phân đoạn dữ liệu tiếp tục thành các lô 50 và vẫn chậm. Các công cụ cho thấy rằng việc tiết kiệm sẽ mất nhiều thời gian hơn và lâu hơn. Không chắc chắn lý do tại sao, tôi đang tạo ngữ cảnh mới cho mỗi lô và trình quản lý hoàn tác được đặt thành không.

Rất tiếc, tôi chưa có bất kỳ điều gì hữu ích để thêm vào cuộc hội thoại này ... Sẽ cập nhật sau.

+0

Bước tiếp theo sẽ là cô lập vấn đề trong một dự án thử nghiệm để những người khác có thể nhìn thấy nó và có khả năng nếu nó không thể giải quyết được, gửi nó cho Apple như một radar. Như với OP, một dòng mã hoặc mô tả không cho phép bất kỳ ai khác giúp bạn. –

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