Ios 面向大数据的CoreData优化

Ios 面向大数据的CoreData优化,ios,iphone,xcode,core-data,Ios,Iphone,Xcode,Core Data,块内的获取请求需要大约9分钟的时间来处理instrument customerArray上的checked对象,而CustomerAddress模型中的对象约为60K,因此我这次必须进行优化 NSArray *customerArray=[engine getItemsForEntity:@"CusCustomer" predicate:nil error:nil]; NSPredicate *predicate = [NSPredicate predicateWithFo

块内的获取请求需要大约9分钟的时间来处理instrument customerArray上的checked对象,而CustomerAddress模型中的对象约为60K,因此我这次必须进行优化

   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);
        }
    }];

}

这可能是从核心数据(或任何数据库)检索数据的最昂贵的方法。您实际上是在创建N个回迁,而不是构建一个查询

考虑将您的逻辑更改为:

  • 通过KVC将CustomerID获取到阵列中:

    NSArray*ids=[customerArray valueForKey:@“id1”]

  • 使用以下谓词获取这些客户的所有发货地址:

    [NSPredicate predicateWithFormat:@“addressTypeVar==%@&&customerIdVar IN%@”,发货地址,ID]; NSArray*发货结果=

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

    NSDictionary*shippingAddresses=[NSDictionary Dictionary WithObjects:shippingResults-forKeys:[shippingResults-valueFOrKey:@“customerIdVar]”

  • 迭代您的客户阵列并关联发货地址:

    for(customerArray中的客户id){ [客户地址CustomerAddressObject:[发货地址[customer.id1]]; }

  • 重复此操作以查找业务地址

  • 但我不得不说,这是一种倒退。理想情况下,在导入或创建数据时,应该创建这些关系。在数据已经存在于存储中之后再这样做效率低下

    其他几点:

    • 如果一个方法返回
      id
      你不需要强制转换它。强制转换只会增加噪声,移除它
    • 您的变量名称很粗糙。我建议删除“Var”,因为它是多余的
    • 考虑分批获取,因为此过程将导致一些严重的内存问题。无论发生什么情况,60K记录都将非常昂贵
    • 执行谓词时,从便宜到昂贵。现在谓词中有字符串比较。这是最昂贵的。如果可以更改数据模型,请将地址类型更改为整数。数字比较要便宜得多

    这可能是从核心数据(或任何数据库)检索数据的最昂贵的方法。您实际上是在创建N个回迁,而不是构建单个查询

    考虑将您的逻辑更改为:

  • 通过KVC将CustomerID获取到阵列中:

    NSArray*ids=[customerArray valueForKey:@“id1”]

  • 使用以下谓词获取这些客户的所有发货地址:

    [NSPredicate predicateWithFormat:@“addressTypeVar==%@&&customerIdVar IN%@”,发货地址,ID]; NSArray*发货结果=

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

    NSDictionary*shippingAddresses=[NSDictionary Dictionary WithObjects:shippingResults-forKeys:[shippingResults-valueFOrKey:@“customerIdVar]”

  • 迭代您的客户阵列并关联发货地址:

    for(customerArray中的客户id){ [客户地址CustomerAddressObject:[发货地址[customer.id1]]; }

  • 重复此操作以查找业务地址

  • 但我不得不说,这是一种倒退。理想情况下,在导入或创建数据时,应该创建这些关系。在数据已经存在于存储中之后再这样做效率低下

    其他几点:

    • 如果一个方法返回
      id
      你不需要强制转换它。强制转换只会增加噪声,移除它
    • 您的变量名称很粗糙。我建议删除“Var”,因为它是多余的
    • 考虑分批获取,因为此过程将导致一些严重的内存问题。无论发生什么情况,60K记录都将非常昂贵
    • 执行谓词时,从便宜到昂贵。现在谓词中有字符串比较。这是最昂贵的。如果可以更改数据模型,请将地址类型更改为整数。数字比较要便宜得多

    Wow,您想做什么?如果您正在显示此数据,请使用NSFetchedResultsController。一个
    NSFetchedResultsController
    用于视图,这是数据处理,
    NSFetchedResultsController
    不会解决任何问题。哇,您想做什么?如果您正在显示此数据,请使用NSFetchedResultsController。一个
    NSFetchedResultsController
    用于查看,这是数据处理,
    NSFetchedResultsController
    无法解决任何问题。谢谢Marcus S.Zarra我需要一个了解更多问题的人请查看。谢谢Marcus S.Zarra我需要一个了解更多问题的人请查看。