go - 通过包含大量元素的 slice 进行搜索

标签 go slice

我前一段时间使用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 {
     ...
   }
}

如果您需要更新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 {
     ...
   }
}

关于go - 通过包含大量元素的 slice 进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59996566/

相关文章:

matlab - 我什么时候可以传递文字 : to a function?

csv - 处理大型 csv 文件并限制 goroutines

html - 通过 Golang 提供 HTML5 应用程序

html - 为什么这个程序不打印任何东西?

python - 为什么在 python 中允许浮点切片 (slice(0,1,0.1)),但调用索引方法 (slice(0,1,0.1).indices) 会引发 TypeError?

arrays - 如何解压 slice

go - 如何从自身调用链码函数来记录子交易

json - 在 Revel (Golang) 中自动解析参数 JSON

python - 根据像素的颜色生成RGB图像的 bool 蒙版的最有效的方法是什么?

go - 为什么一个空 slice 有 24 个字节?