我有一个需要访问此风数据的C ++程序,每6小时刷新一次。由于服务器的客户端需要数据,服务器查询数据库并将数据提供给客户端。客户端将使用lat,lon和mb作为键来查找5个值。
+------------+-------+-----+-----+----------+----------+-------+------+------+
| id | lat | lon | mb | wind_dir | wind_spd | uv | vv | ts |
+------------+-------+-----+-----+----------+----------+-------+------+------+
| 1769584117 | -90.0 | 0.0 | 100 | 125 | 9 | -3.74 | 2.62 | 2112 |
| 1769584118 | -90.0 | 0.5 | 100 | 125 | 9 | -3.76 | 2.59 | 2112 |
| 1769584119 | -90.0 | 1.0 | 100 | 124 | 9 | -3.78 | 2.56 | 2112 |
由于数据不经常更改,我希望服务器缓存数据,因此如果客户端需要先前查询的数据,则不需要第二个SQL查询。
我试图在存储/速度方面确定最有效的内存数据结构,但更重要的是,易于访问。
我最初的想法是一个由lat键入的地图,其中包含一个由lon键入的地图,其中包含一个由mb键入的地图,其值是包含wind_dir,wind_speed,uv,vv和ts字段的地图。
但是,这很复杂。另一个想法当然是包含最后5个字段的结构的三维数组(lat,lon,mb索引)。
当我坐在这里时,我提出了将lat,lon和mb组合成一个字符串的想法,这可以用作地图的索引,因为我99%肯定了lat的组合,lon和mb永远是独一无二的。
还有哪些其他想法有意义?
编辑:下面评论的更多细节
就数据而言,数据集中有3,119,040行。这将是相当稳定的,尽管随着新报告站的增加,这些年可能会缓慢增长。通常有700到1500个客户端请求数据。客户是飞行模拟器。默认情况下,他们每5分钟会请求一次数据,但最大可能的频率是每30秒。没有其他信息 - 您在上面看到的是希望返回的数据。
最后一点我忘了提到:我的C ++特别是STL的东西很生锈,所以更简单,更好。
答案 0 :(得分:1)
您可以将std::map
与三部分密钥和一个合适的小于运算符一起使用(这是Crazy Eddie提出的,扩展了一些代码行)
struct key
{
double mLat;
double mLon;
double mMb;
key(double lat, double lon, double mb) :
mLat(lat), mLon(lon), mMb(mb) {}
};
bool operator<(const key& a, const key& b)
{
return (a.lat < b.lat ||
a.lat == b.lat && a.lon < b.lon ||
a.lat == b.lat && a.lon == b.lon && a.mb < b.mb);
}
定义并插入地图将如下所示:
std::map<key, your_wind_struct> values;
values[key(-90.0, 0.0, 100)] = your_wind_struct(1769584117, 125, ...);
答案 1 :(得分:0)
有序矢量也很有意义。您可以使用较少的谓词来比较您的三部分键。您可以使用地图或集合执行相同操作。哈希...取决于您选择的容器的很多因素。
答案 2 :(得分:0)
另一个选项是c ++ 11 unordered_set,它使用哈希表而不是红黑树作为内部数据结构,并给出(我相信)O(1)vs O(logn)的摊销查找时间红黑。您使用哪种数据结构取决于所讨论数据的特征 - 有多少数据,可能访问特定记录的频率等等。我同意几个评论员的意见,即使用结构作为关键是最干净的方式。它还允许您更简单地改变唯一键的内容,如果将来发生变化;你只需要在你的键结构中添加一个成员,而不是创建一个全新的地图级别。