我有一个相当大的分层数据集我正在导入。导入后数据库的总大小在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];
答案 0 :(得分:0)
您可以查看在循环中设置本地自动释放池。
[database open];
[database beginTransaction];
NSArray *firstLevels = [[FirstLevel fetchFromURL:url retain];
for (FirstLevel *firstLevel in firstLevels)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
...
[pool release];
}