我正在做我的侧面项目很长一段时间 - 它是一个基于网络的在线军队战斗模拟器。在目前阶段,我获得了大量数据(压缩军队),我需要将其保存在服务器中。我可以将它们放在SQL / noSQL / File(这些或所有这些中的任何一个)中,但我需要它易于搜索,所有步骤都在1~2秒内完成。
我有一张地图,它有许多矩形 - 军队(彼此不重叠),大约100个。我需要得到这些矩形的列表,这些矩形可以在我的电脑屏幕上看到(屏幕就像一个矩形)。那么它是 - 哪个矩形与给定的矩形重叠?
每个矩形的数据:
x,width,y,height,rectangle_data(这里是1到10百万个其他数组的数组)。
首先 - 我提供我的屏幕数据 - 宽度/高度,x,y(x,y不是0,因为我可以通过改变x,y来拖动地图。)
然后我需要获取属于我视图的矩形列表。并下载所有数据。然后我可以观看由这些数据组成的军队战斗动画。
我拥有的真实数据:
// [x, width, y, height], [id, other_id], [huge_list_of_data]
[[[50,1,144,1],[1,3],[[92,134]]]] // one unit data
[[[92,1,134,1],[2,0],[[41,144]]]] // one unit data
[[[49,8,136,8],[1,2],[.. 64 arrays ..] // 64 units data
这些数据行大约有100个,所有这100个数据行都属于1个动画帧。在整个动画期间,有大约10000个动画帧。每个月可以有100个动画。
因此,我需要将所有这些数据保存在服务器中并使其易于搜索。到目前为止,我的计划是:
因为rectangle_data可以是1000万个数组长度,我的计划是 把它保存在txt文件中。
当我需要矩形列表时,我将提供当前动画 框架,通过这个框架,我可以更快地在数据库中搜索。但我的计划是一次获得100帧数据,以减少服务器IO并缓存军队战斗数据真正的5秒。
如果我只将[x,width,y,height]值放入redis DB,我可以制作 $ redis中的键如:animation_id.frame.x_width_y_height =>例如11.151.50_1_144_1,该值指向rectangle_data存储位置(txt文件路径和row_min~row_max,其中放置rectangle_data)。但是如您所见,50_1_144_1不是自然可搜索的,我可以在服务器中解析它。搜索起来不太舒服。
然后我可以得到所有矩形的列表 $ redis.hkeys(animation_id,frame)并为每一帧重复100次。或者尝试使用find_in_batches之类的东西,如果在这种情况下有效的话。所以我将获得50_1_144_1的数组 - 类似格式的刺痛。
使用该信息,我将迭代$ redis字符串的数组,其大小约为100 * 100,并且每个键通过询问$ redis.hget(11,151,50_1_144_1)=>得到该值。点击$ redis DB 10.000次。其中一个值是文件名(例如11.txt)和行号(例如115~558)。然后将此数据推送到Object [11] .push([115,558])之类的对象。然后,对于每个对象的键,打开名为key的文件,如果该数据行包含在行数组范围内,则获取数据。然后创建另一个对象,并将此数据推送到对象[frame]。然后通过AJAX将这个庞大的对象发送到前端。
到目前为止,这是我的计划。几个小时都在考虑它。而且它是sux。我是初级程序员,在这种情况下没有经验。但这是我的侧面项目,所以我有很多时间来决定。
任何人都比我现在的想法更好吗?我需要更好的东西,我怎样才能更快地搜索地理定位数据。可以接受任何数据库示例,在这种情况下可以更轻松地工作。我正在使用Ruby on Rails,到目前为止我只知道postgres,mysql,redis,elasticseach DB。因此,如果与其他神秘数据库相比会更好,我会研究它。