Próbuję zaimportować dużą ilość danych do podstawowego magazynu danych w telefonie iPhone. Używam podkładu SQLite dla głównej składnicy danych. Wydaje się, że trwa to znacznie dłużej, niż oczekiwałbym. Zmniejszyłem procedury tak, aby zasadniczo było to po prostu pobranie obiektu (aby sprawdzić, czy już istnieje), a następnie utworzenie nowego obiektu, jeśli tak nie jest (nigdy nie robią, ponieważ importuję dane). Pobieranie nie jest jednak czasochłonne. To tworzenie obiektów. Zasadniczo, jest kod naruszającym przepisy:Jak poprawić wydajność wkładki obiektu Core Data na telefonie iPhone?
MobileObject *newObject = (MobileObject *)[NSEntityDescription insertNewObjectForEntityForName:objDesc inManagedObjectContext:managedObjectContext];
Zauważyłem, że na symulatorze, jest dość szybki na starcie z około 100 obiektów stworzył drugi. Spowalnia jednak spowolnienie i do czasu, gdy powstaje pięć tysięcy obiektów, to prawie 2 sekundy dla 100 obiektów i do czasu utworzenia 10 tysięcy obiektów, to 4 sekundy na 100 obiektów. Cała grupa 21000 obiektów zajmuje więcej niż 10 minut. Jest tak ze wszystkimi rzeczywistymi użytymi kodami (to tylko pobranie i tworzenie obiektu). Na urządzeniu jest znacznie wolniej (o 4 razy więcej).
Nie rozumiem, dlaczego dane podstawowe zaczynają się szybko, ale potem zaczynają zwalniać. Próbowałem zarówno z indeksem i bez indeksów na moich danych. Próbowałem już stworzyć własną pulę autorelease, którą okresowo drenuję w swojej pętli. Próbowałem oszczędzać po każdym stworzeniu obiektu. Próbowałem czekać do końca, aby zapisać. Ale bez względu na to, co robię, występ nadal wydaje się nieszczęśliwy. Czy to jest tak powolne dodawanie nowego obiektu do podstawowego magazynu danych z kilkoma tysiącami obiektów? Jakieś sugestie?
Muszę skomentować, że faktycznie uważam, że te pobrania zabierają znaczną ilość czasu. Przypuszczam, że ma to sens, ponieważ gdy sklep staje się większy, jest więcej obiektów do przeszukiwania. – Mike
Na marginesie, obsada w powyższym przykładowym kodzie jest niepotrzebna. '-insertNewObjectForEntity ...' zwraca 'identyfikator', a zatem nie ma i nie powinien być rzutowany. –
Tworzenie ogromnej bazy danych w ten sposób może być niewiarygodnie powolne, jeśli czeka się do końca, aby zapisać. Generalnie oszczędzam po kilku tysiącach nowych obiektów, nie eksperymentowałem, aby znaleźć optymalną częstotliwość. –