【问题标题】:Looking for advice on importing large dataset in sqlite and Cocoa/Objective-C寻找有关在 sqlite 和 Cocoa/Objective-C 中导入大型数据集的建议
【发布时间】:2011-01-29 07:09:04
【问题描述】:

我正在导入一个相当大的分层数据集。导入后的数据库总大小在 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];

【问题讨论】:

    标签: xml cocoa json sqlite import


    【解决方案1】:

    你可以看看在你的循环中设置一个本地自动释放池。

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

    【讨论】:

    • 之前有泄漏,所以我取出了所有的自动释放池以便更容易地诊断泄漏。我没有把它们放回去,因为我认为我没有那么多自动释放的对象。男孩是我错了。
    猜你喜欢
    • 2011-05-23
    • 2014-05-28
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2016-12-17
    相关资源
    最近更新 更多