我需要知道在MuleSoft中比较两个非常大的数组的快速有效的方法 [英] Need to know a fast and efficient way to compare two very large arrays in MuleSoft
本文介绍了我需要知道在MuleSoft中比较两个非常大的数组的快速有效的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Salesforce数据将以JSON格式传入:
[
{
"Product_Line__c": "Sample",
"ExternalId__c": "a9M5C000000GoJxUAK",
},
{
"Product_Line__c": "Sample2",
"ExternalId__c": "a9M5C000000GoJxUAL"
}
]
数据库记录以JSON格式传入:
[
{
"changed_on": "2021-12-08T11:24:50",
"primaryKey":"a9M5C000000GoJxUAL"
},
{
"changed_on": "2021-12-08T11:24:50",
"primaryKey":"a9M5C000000GoJxUAQ"
}
]
主键为字符串
预期输出(Salesforce和数据库中的主/外部ID差异:
[
"ExternalId__c" : "a9M5C000000GoJxUAK",
"Is_RM_Deleted__c" : true
]
我们有没有其他更好的方法可以更快地到达操作下方?
Salesforce.External aID是一个包含80k记录的数组
database ase.primary yKey是一个包含80k记录的数组
%dw 2.0
output application/json
(salesforce.externalID -- database.primaryKey)
map {
"ExternalId__c": $,
"Is_RM_Deleted__c": true
}
推荐答案
通常,DW不是性能瓶颈。 您正在从数据库和Salesforce加载160k记录。 默认情况下,MuleSoft会尝试流式传输这些记录,并且一开始只加载几条记录。 在DW代码中,您同时使用两个流,这意味着在执行DW转换时,MuleSoft会将所有160K记录加载到内存中,这可能需要一些时间。
如果您希望了解消耗每个流需要多长时间, 您可以在DB和Salesforce查询之后添加带有sizeOf()的转换操作符。此sizeOf()函数使用流,您可以这样对其计时。如果性能瓶颈是加载数据,您可能必须将其分解为较小的区块。
如果内存中已经有数据,您可以尝试这样的操作:
如果将记录加载到内存不是瓶颈,您可以尝试这样的操作:
%dw 2.0
output application/json
var salesforce = [
{ externalID: 1 },
{ externalID: 2 },
{ externalID: 3 }
]
var database = [
{ primaryKey: 1 },
{ primaryKey: 2 }
]
var bSearch = java!java::util::Arrays::binarySearch
var databaseSortedArray = database.primaryKey orderBy ($)
---
salesforce
filter ((databaseSortedArray bSearch $.externalID) < 0)
map {
ExternalId__c: $.externalID,
Is_RM_Deleted__c: true,
}
它使用标准的java函数进行二进制搜索,这需要对PrimaryKey数组进行排序。 为了获得更好的性能,您可以将ORDER BY子句添加到SQL查询,以便在数据库中进行排序。
这篇关于我需要知道在MuleSoft中比较两个非常大的数组的快速有效的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文