循环切片或使用映射更好地检索对象

我有一个包含大约 3000 个 bson 对象的切片。每个对象都有一些嵌套映射,一个对象的平均大小为4 kb. 在我的代码中,我必须能够uid尽可能快地根据它们的字段检索这些对象。我最初的计划是编写一个函数来简单地循环遍历原始切片并检查匹配,uid例如object["uid"] == uidToFind. 但是现在我相信最好创建一个大映射,其中键使用uid字段而值使用相应的对象,就像这样:

m := make(map[string]bson.M)
m["sample_UID_0"] = bsonObjects[0]
m["sample_UID_1"] = bsonObjects[1]
//... continue with the remaining 3000 objects...

我的问题是,我是否应该支持这种解决方案而不是每次都循环遍历原始切片?由于我没有数百万个对象,因此我认为将重要内容保存在一个全局可用的映射中并简单地访问它们m["sample_UID"]而不是总是遍历整个切片是一个更好的主意。


交互式爱情
浏览 108回答 1
1回答

心有法竹

除了性能和内存使用之外,这两种解决方案之间还有一个主要区别,您的地图定义方式只能包含一个具有相同 ID 的条目。没有什么能阻止你的数组中有多次相同的 id。通常,如果您的数组已排序,您可以使用二分法搜索,这与地图中的搜索不会产生任何明显的差异,但您必须在添加新条目时保持数组排序。所以这个解决方案的好处取决于你的阵列是否经常被修改。数组应该比映射使用更少的内存。在您的具体示例中,3000 个条目并不多。根据在数据结构中搜索的频率,您可能不会明显注意到性能方面的任何差异。您可能想使用基准测试来检查。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go