【问题标题】:CoreData optimization for big data针对大数据的 CoreData 优化
【发布时间】:2014-06-10 12:42:56
【问题描述】:

块内的获取请求大约需要 9 分钟来处理仪器 customerArray 上的检查有大约 60K 对象,而 CusCustomerAddress 模型有大约 30k 对象,所以我必须优化这次。

   NSArray *customerArray=[engine getItemsForEntity:@"CusCustomer" predicate:nil error:nil];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"id1 == $idVar"]];
        NSPredicate *predicateCustomerAddress = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"customerId == $customerIdVar AND addressType == $addressTypeVar"]];

    [customerArray enumerateObjectsUsingBlock:^(CusCustomer *customer, NSUInteger idx, BOOL *stop) {            
        NSString *customerId=customer.id1;
        NSString *addressType = ShippingAddress;
        NSDictionary *variablesAddress = @{ @"customerIdVar" : customerId , @"addressTypeVar" : addressType};
        NSArray *resultAddress = [engine getItemsForEntity:@"CusCustomerAddress" predicate:[predicateCustomerAddress        predicateWithSubstitutionVariables:variablesAddress] error:nil];
        if (resultAddress.count == 1 ) {
            [customer addCustomerAddressObject:(CusCustomerAddress *)[resultAddress lastObject]];
        }
        else
        {
            DLogHp(@"More than one tuple Exist For  this'id1' =\"%@\" in \"CusCustomerGroup\"",objId);
        }
        addressType = BillingAddress;
        NSDictionary *variablesAddress1 = @{ @"customerIdVar" : customerId , @"addressTypeVar" : addressType};

        NSArray *resultaddress1 = [engine getItemsForEntity:@"CusCustomerAddress" predicate:[predicateCustomerAddress predicateWithSubstitutionVariables:variablesAddress1] error:nil];

        if (resultaddress1.count == 1 ) {
            [customer addCustomerAddressObject:(CusCustomerAddress *)[resultaddress1 lastObject]];
        }
        else
        {
            DLogHp(@"More than one tuple Exist For  this'id1' =\"%@\" in \"CusCustomerGroup\"",objId);
        }
    }];

}

【问题讨论】:

  • 哇,你想做什么?如果要显示此数据,请使用 NSFetchedResultsController。
  • NSFetchedResultsController 用于查看,这是数据处理,NSFetchedResultsController 不会解决任何问题。

标签: ios iphone xcode core-data


【解决方案1】:

这可能是从 Core Data(或任何数据库)中检索数据的最昂贵的方法。您实际上是在创建 N 次提取,而不是构建单个查询。

考虑将您的逻辑更改为:

  1. 通过 KVC 获取 customerID 到一个数组中:

    NSArray *ids = [customerArray valueForKey:@"id1"];

  2. 使用如下谓词获取这些客户的所有送货地址:

    [NSPredicate predicateWithFormat:@"addressTypeVar == %@ && customerIdVar IN %@", ShippingAddress, ids]; NSArray *shippingResults = ...;

  3. 根据 customerID 将提取结果转换为字典

    NSDictionary *shippingAddresses = [NSDictionary dictionaryWithObjects:shippingResults forKeys:[shippingResults valueFOrKey:@"customerIdVar"];

  4. 遍历您的客户数组并关联送货地址:

    for (id customer in customerArray) { [客户 addCustomerAddressObject:[shippingAddresses[customer.id1]]]; }

  5. 企业地址重复

我不得不说,这是相当倒退的。理想情况下,您应该在导入或创建数据时创建这些关系。在数据已经在存储中之后再做是低效的。

其他几点:

  • 如果方法返回id,则不需要强制转换它。演员只是增加了噪音,将其移除。
  • 您的变量名称很粗糙。我建议删除“Var”,因为它是多余的
  • 考虑分批提取,因为此过程会导致一些严重的内存问题。无论如何,6 万条记录都会很昂贵。
  • 在做谓词时,从便宜到昂贵。现在你的谓词中有字符串比较。那是最贵的。如果您可以更改数据模型,请将地址类型更改为整数。数字比较便宜得多。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2020-08-24
  • 2011-01-07
  • 2018-12-16
  • 1970-01-01
相关资源
最近更新 更多