我前一段时间使用API,以使存储在两个不同系统中的记录彼此保持同步。它一直运行良好,但是遇到了我要同步的具有大量记录的新表的问题。以下是基本前提。
table1和table2是反射(reflect)我要保持同步的数据的结构片段。可以处理大约20,000条记录。但是我现在正在使用200,000,这并不是很有效,因为我实际上有效地遍历了每行200,000次,这导致数十亿次循环。有没有更有效的方法来实现这一目标?
for _, item1 = range table1 {
for _, item2 = range table2 {
if item1.id == item2.id {
itemsAreEqual = reflect.DeepEqual(item1, item2)
if !itemsAreEqual {
//Update Stuff
}
}
}
}
最佳答案
如果表中元素的顺序并不重要,请改用两个映射:
for id1, item1:=range table1 {
if item2, ok:=table2[id1]; ok {
...
}
}
如果您需要更新
item1
和item2
成员,最好将这些映射设置为map[idType]*Item
而不是map[idType]Item
。如果顺序很重要,则可以对数组加映射执行相同的操作:
ids:=make(map[idType]*Item)
for i,item:=range table2 {
ids[item.id]=&table2[i]
}
for id1, item1:=range table1 {
if item2, ok:=ids[id1]; ok {
...
}
}
关于go - 通过包含大量元素的 slice 进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59996566/