搜索包含大量元素的切片

问题描述 投票:1回答:1

我前一段时间使用API​​,以使存储在两个不同系统中的记录彼此保持同步。它一直运行良好,但是遇到了我要同步的新表的问题,该表有大量记录。以下是基本前提。

table1和table2是一片结构,反映了我试图保持同步的数据。这对于大约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
            }
        }
    }
}
go slice
1个回答
3
投票

如果表中元素的顺序不重要,请改用两个映射:

for id1, item1:=range table1 {
   if item2, ok:=table2[id1]; ok {
     ...
   }
}

如果需要更新item1item2成员,最好将这些映射设置为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 {
     ...
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.