我有如下场景:
我需要找出一个非常大的集合中唯一的id列表。
例如,我有6000个id数组(关注者列表),每个数组的大小可以在1到25000之间(他们的关注者列表)。
我想获取所有这些id数组中唯一的id列表(关注者的关注者的唯一列表)。完成后,我需要减去另一个id列表(另一个人的关注者列表),并得到最终计数。
最终唯一id集合增长到约为60,000,000条记录。在Ruby中将数组添加到大数组时,在几百万时它开始变得非常缓慢。添加到集合需要开始花费0.1秒,然后在200万时需要超过4秒(远远不足以满足我的需求)。
我在Java中编写了一个测试程序,可以在一分钟内完成整个过程。
也许我在Ruby中实现不够高效,或者还有其他方法。由于我的主要代码是专有的,我编写了一个简单的测试程序来模拟这个问题:
big_array = []
loop_counter = 0
start_time = Time.now
# final target size of the big array
while big_array.length < 60000000
loop_counter+=1
# target size of one persons follower list
random_size_of_followers = rand(5000)
follower_list = []
follower_counter = 0
while follower_counter < random_size_of_followers
follower_counter+=1
# make ids very large so we get good spread and only some amt of dupes
follower_id = rand(240000000) + 100000
follower_list << follower_id
end
# combine the big list with this list
big_array = big_array | follower_list
end_time = Time.now
# every 100 iterations check where we are and how long each loop and combine takes.
if loop_counter % 100 == 0
elapsed_time = end_time - start_time
average_time = elapsed_time.to_f/loop_counter.to_f
puts "average time for loop is #{average_time}, total size of big_array is #{big_array.length}"
start_time = Time.now
end
end
有什么建议吗?是时候转向jruby并将这样的东西移到Java上了吗?
loop_counter=0
。虽然与建议的哈希方法相比,数组访问方法要慢得多,但循环时间实际上并没有增长得那么快。在200万条记录的情况下,循环时间会从初始的0.09秒增长到约0.27秒,增长了三倍。 - Eric Hu