草庐IT

iphone - 性能 : Core Data relationships get faulted after being assigned

coder 2023-09-23 原文

我有一个 Core Data 模型代表 iOS 4+ 上的电视指南,有 3 个类:

  • channel (BBC 1)
  • 程序(最高档)
  • 广播(周一晚上 8 点在 BBC 1 台的 Top Gear)

我有大约 40 个 channel 、8000 个节目和 6000 个广播,我想微调导入过程,使其运行时间不超过一分钟。

导入 channel 和节目很容易,因为它们是独立的对象。然而,广播与 channel 和节目有关系(一对多), channel 和节目都与广播有反向关系(多对一)。为了加快速度,我有一个故障 channel 和节目的内存字典,其中仅预取了它们的 Web 服务标识符:我创建了一个广播并查看两个字典以获取相应的 channel 和节目,而无需往返数据库。

但是,当我将节目或 channel 分配给广播时, channel 和节目的反向关系访问会立即触发两个对象的故障,导致大幅减速(6000 * 2 请求)和随之而来的内存压力,如Core Data Faults Instruments 报告。我尝试在 channel 和节目中预取 broadcasts 关系,但该关系仍然出错。

你知道为什么反向关系会被访问并指责他们的 parent 吗?保存关系时如何避免从数据库中读取数据?

更新:示例代码,我为 Broadcast 实例分配/更新方法。 dictionary 变量来自 Web 服务,channelsprograms 包含由 Web 服务标识符索引的故障 channel 和程序对象。故障发生在 self.program = programself.channel = channel 行。

- (BOOL)assignWithDictionary:(NSDictionary *)dictionary channels:(NSDictionary *)channels programs:(NSDictionary *)programs {
    // Add channel relationship
    NSNumber *channelIdentifier = [dictionary objectForKey:@"channel_id"];

    if (self.channel == nil || ![self.channel.identifier isEqualToNumber:channelIdentifier]) {
        Channel *channel = [channels objectForKey:channelIdentifier];

        if (channel == nil) {
            NSLog(@"Broadcast %@ has invalid channel: %@", identifier, channelIdentifier);

            return NO;
        }

        self.channel = channel;
    }

    // Same to add a program relationship
    // ...
}

以及我获取 channel 或节目列表的获取请求:

- (NSDictionary *)itemsForEntity:(NSEntityDescription *)entity {
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    NSError *error = nil;
    NSArray *itemsArray = nil;

    request.entity = entity;

    request.relationshipKeyPathsForPrefetching = [NSArray arrayWithObject:@"broadcasts", nil];
    request.propertiesToFetch = [NSArray arrayWithObjects:@"identifier", @"version", nil];

    itemsArray = [self.context executeFetchRequest:request error:&error];
    NSAssert1(error == nil, @"Could not fetch the items from the database: %@", error);

    {
        NSMutableDictionary *items = [NSMutableDictionary dictionaryWithCapacity:itemsArray.count];

        for (NSManagedObject *item in itemsArray) {
            [items setObject:item forKey:[item valueForKey:@"identifier"]];
        }

        return [NSDictionary dictionaryWithDictionary:items];
    }
}

最佳答案

不完全确定您要在这里做什么,但是...

首先,您不能仅使用错误来更改属性。故障只是占位符,可让您测量/计算对象图和遍历关系。如果你真的改变了关系,它会触发导致相关对象加载的错误。

如果您尝试仅使用故障来设置特定 ChannelProgramBroadcast 对象之间的关系,那是行不通的。

你的 itemsForEntity: 方法我不明白。它将获取传递的实体的每个现有托管对象,然后它将在字典中返回这些对象。这将导致大量内存开销,尤其是在 Program 对象有 8,000 个的情况下。

您不能使用 propertiesToFetch 除非您将提取返回设置为字典,而您没有这样做。如果需要设置关系,无论如何都不能使用字典返回类型。当您只需要某些属性中保存的数据时,您可以同时使用这两种方法。它不是用于操纵对象图关系的工具。

设置 relationshipKeyPathsForPrefetching 只会在您知道您将访问现有关系时加快速度。当您首先建立关系时,这无济于事,例如如果 broadcasts 关系中没有现有对象,或者您正在添加或删除 Broadcast 对象,则预取 broadcasts 键路径对您没有任何作用。

我不确定我是否足够了解您的数据模型,但我认为您采用了错误的方式。在我看来,您正试图将 identifier 用作 SQL 数据库中的主键,这会适得其反。在 Core Data 中,关系将对象链接在一起,而不是共享属性和值。

通常,如果您有两个或多个具有相同属性名称和相同值的对象,那么在大多数情况下您的数据模型设计不佳。

关于iphone - 性能 : Core Data relationships get faulted after being assigned,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7041236/

有关iphone - 性能 : Core Data relationships get faulted after being assigned的更多相关文章

  1. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

  2. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  3. ruby-on-rails - 如果条件与 &&,是否有任何性能提升 - 2

    如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:

  4. ruby - 如何找到我的 Ruby 应用程序中的性能瓶颈? - 2

    我编写了一个Ruby应用程序,它可以解析来自不同格式html、xml和csv文件的源中的大量数据。我如何找出代码的哪些区域花费的时间最长?有没有关于如何提高Ruby应用程序性能的好资源?或者您是否有任何始终遵循的性能编码标准?例如,你总是用加入你的字符串吗?output=String.newoutput或者你会使用output="#{part_one}#{part_two}\n" 最佳答案 好吧,有一些众所周知的做法,例如字符串连接比“#{value}”慢得多,但是为了找出您的脚本在哪里消耗了大部分时间或比所需时间更多,您需要进行分

  5. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  6. ruby - GC.disable 的任何性能缺点? - 2

    是否存在GC.disable会降低性能的情况?只要我使用的是真正的RAM而不是交换内存,就可以这样做吗?我正在使用MRIRuby2.0,据我所知,它是64位的,并且使用的是64位的Ubuntu:ruby2.0.0p0(2013-02-24revision39474)[x86_64-linux]Linux[redacted]3.2.0-43-generic#68-UbuntuSMPWedMay1503:33:33UTC2013x86_64x86_64x86_64GNU/Linux 最佳答案 GC.disable将禁用垃圾回收。像rub

  7. ruby-on-rails - Rails with angular 与 Rails pure(查看性能) - 2

    我尝试在Internet上搜索有关使用angularJS进入RubyonRails项目与RubyonRailspure的View性能的信息。我的问题是因为2个月前我开始使用纯AngularJS,现在我需要将AngularJS集成到一个新项目中,但需要展示使用带有RubyonRails的AngularJS呈现View的性能如何,并消除对RubyonRails的负担.例如:带Rails的Angular:使用RubyonRails获取数据(从数据库或GET请求),将信息发送到file.js.erb并使用AngularJS操作数据并显示带有解析数据的View。纯粹的Rails:(自然流程)使用

  8. ruby-on-rails - 在 Rails 3 应用程序中使用 require_dependency 对性能有何影响? - 2

    我觉得我理解require和require_dependency之间的区别(来自Howarerequire,require_dependencyandconstantsreloadingrelatedinRails?)。但是,我想知道如果我使用一些不同的方法(参见http://hemju.com/2010/09/22/rails-3-quicktip-autoload-lib-directory-including-all-subdirectories/和Bestwaytoloadmodule/classfromlibfolderinRails3?)来加载所有文件会发生什么,所以我们:

  9. arrays - Ruby 中的并行分配性能 - 2

    设置一个临时变量来交换数组中的两个元素似乎比使用并行赋值更有效。谁能帮忙解释下?require"benchmark"Benchmark.bmdo|b|b.reportdo40000000.times{array[1],array[2]=array[2],array[1]}endendBenchmark.bmdo|b|b.reportdo40000000.timesdot=array[1]array[1]=array[2]array[2]=tendendend结果:usersystemtotalreal4.4700000.0200004.490000(4.510368)usersyste

  10. ruby - JRuby vs YARV 性能——显着差异? - 2

    我读到最新版本的Ruby解释器(YARV)将由于字节码编译而有实质性的性能改进。我的问题是有人试过对JRuby运行这个吗?在Windows上执行时有什么明显的不同吗?此链接有一些很好的指标,但大多数是在Linux上运行的...http://antoniocangiano.com/2007/02/19/ruby-implementations-shootout-ruby-vs-yarv-vs-jruby-vs-gardens-point-ruby-net-vs-rubinius-vs-cardinal/提前致谢!托德 最佳答案 该fi

随机推荐