如何在一亿张美照中快速找出女朋友的照片?
假如现在有一亿张美照,如何快速判断这些照片中是否有你女朋友的照片呢?小孩子才做选择,成年人全都要,哈哈哈
数据分片
我们可以通过对图片信息进行提取,获取唯一标志,构建散列表,然后就可以通过判断新图片的唯一标志是否在散列表中,确认新图片是否在图库中存在。是不是很简单?如果构建散列表需要的空间超过了机器的内存,这时候就要增加多台机器了,然后把数据分给多台机器处理,每台主机构建一部分图片的散列表。往里面添加一个新的图片时,可以通过哈希函数计算获取的图片的哈希值,然后与机器的个数 n 求模,得到的值就为要存放图片的机器编号。判断一个图片是否在图库中存在时,通过同样的哈希算法,获取这个图片的哈希值,然后与机器的个数 n 求模,得到值 k,然后去编号为 k 机器上的散列表中查找。
估算一亿张图片构建散列表大概需要多少台机器?
散列表中存放的每个数据单元需要包含两个信息,哈希值和图片文件的路径,假设使用 MD5 计算哈希值,那么哈希值的长度就是128位(bit)
,也就是16字节(B)
,文件路径长度的上限是 256B
,我们可以假设平均长度是128B
,如果我们使用链表法解决散列冲突,那么还需要存储冲突,那还需要存储指针,指针只占用8B
,所有散列表中每个单元就占用152B
。(估算值)假设一台服务器的可用内存大小为4GB,散列表的负载因子为 0.75,那么一台机器大约可以构建两千万(4GB*0.75/152B
)照片的散列表。所以对一亿张图片构建散列表索引,大约需要五六台机器,在工程中,估算项目需要的成本,可以让我们实现对需要投入的资源、自检有个大概的了解,能更好的评估解决方案的可行性。面对海量的数据时,对资源进行分片的分布式处理,可以突破单机性能的限制。