Нужны советы по импорту большого набора данных в sqlite и Cocoa / Objective-C - PullRequest
0 голосов
/ 19 марта 2010

У меня довольно большой иерархический набор данных, который я импортирую. Общий размер базы данных после импорта составляет около 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];

1 Ответ

0 голосов
/ 19 марта 2010

Вы могли бы взглянуть на настройку локального пула автоматического выпуска в вашем цикле.

[database open];
[database beginTransaction];
NSArray *firstLevels = [[FirstLevel fetchFromURL:url retain];
for (FirstLevel *firstLevel in firstLevels)
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

...

    [pool release];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...