寻找有关在sqlite和Cocoa / Objective-C中导入大型数据集的建议

时间:2010-03-19 02:25:35

标签: xml cocoa json sqlite import

我有一个相当大的分层数据集我正在导入。导入后数据库的总大小在sqlite中大约为270MB。我当前的方法有效,但我知道我在做这些事情时会占用内存。例如,如果我使用Zombies运行,我的系统会冻结(尽管如果我不使用该仪器它会执行得很好)。我希望得到一些算法建议。

我有三个分层表,包含大约400,000条记录。最高级别有大约30个记录,下一个大约有20,000个,最后一个有余额。现在,我正在使用嵌套for循环导入。

我知道我正在创建一个不合理的大型对象图,但我也希望序列化为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 :(得分:0)

您可以查看在循环中设置本地自动释放池。

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

...

    [pool release];
}