У меня довольно большой иерархический набор данных, который я импортирую. Общий размер базы данных после импорта составляет около 270 МБ в sqlite. Мой текущий метод работает, но я знаю, что загружаю память, когда я делаю это. Например, если я запускаю с Zombies, моя система зависает (хотя она будет работать нормально, если я не использую этот инструмент). Я надеялся на некоторый совет алгоритма.
У меня есть три иерархические таблицы, содержащие около 400 000 записей. Самый высокий уровень имеет около 30 записей, следующий имеет около 20 000, последний имеет баланс. Прямо сейчас я использую вложенные циклы для импорта.
Я знаю, что создаю неоправданно большой граф объектов, но я также ищу сериализацию в JSON или XML, потому что я хочу разбить записи на загружаемые куски, чтобы конечный пользователь мог импортировать их по меню. У меня есть код, написанный для сериализации, но мне интересно, могу ли я сериализовать граф объектов, если у меня есть только фрагменты в памяти.
Вот псевдокод, показывающий основной процесс импорта sqlite. Я пропустил ненужные детали.
[database open];
[database beginTransaction];
NSArray *firstLevels = [[FirstLevel fetchFromURL:url retain];
for (FirstLevel *firstLevel in firstLevels)
{
[firstLevel save];
int id1 = [firstLevel primaryKey];
NSArray *secondLevels = [[SecondLevel fetchFromURL:url] retain];
for (SecondLevel *secondLevel in secondLevels)
{
[secondLevel saveWithForeignKey:id1];
int id2 = [secondLevel primaryKey];
NSArray *thirdLevels = [[ThirdLevel fetchFromURL:url] retain];
for (ThirdLevel *thirdLevel in thirdLevels)
{
[thirdLevel saveWithForeignKey:id2];
}
[database commit];
[database beginTransaction];
[thirdLevels release];
}
[secondLevels release];
}
[database commit];
[database release];
[firstLevels release];