sot*_*ips 6 python mysql performance solr
考虑到时间(例如,当前星期二下午4:24),我希望能够选择目前在一组业务中开放的所有业务.
存储这些打开/关闭时间的最有效方法是什么,以便通过单个时间/星期几元组,我可以快速找出哪些业务是开放的?
我正在使用Python,SOLR和mysql.我希望能够在SOLR中进行查询.但坦率地说,我对任何建议和备选方案持开放态度.
如果您愿意一次只查看一周,您可以将所有开始/结束时间规范化为自本周开始以来设定的分钟数,例如周日0小时.对于每个商店,您创建了许多形式为[startTime,endTime,storeId]的元组.(对于跨越周日午夜的小时数,你必须创建两个元组,一个到本周末,一个从一周开始).这组元组将在startTime和endTime上编制索引(例如,使用您要预处理的树).元组不应该那么大:一周只有大约10k分钟,可以容纳2个字节.这种结构在具有适当索引的MySQL表中是优雅的,并且在信息改变时对记录的常量插入和删除非常有弹性.您的查询只是"选择storeId,其中startTime <=时间和结束时间> =时间",其中时间是星期日午夜以来的规范化分钟.
如果信息不经常更改,并且您希望查找速度非常快,则可以预先解决所有可能的查询并缓存结果.例如,一周只有672个季度小时.有了一个企业列表,每个企业都有像Brandon Rhodes解决方案一样的开放和关闭时间列表,您可以简单地,在一周内每隔15分钟迭代一次,找出谁打开,然后将答案存储在查找表中或内存列表.
另一位受访者提到的位图字段效率会非常高,但如果您希望能够处理半小时或四分之一小时的时间,则会变得混乱,因为您必须每次算术增加位数和字段设计您遇到了必须匹配的新分辨率.
我会尝试将值作为日期时间存储在列表中:
openclosings = [ open1, close1, open2, close2, ... ]
Run Code Online (Sandbox Code Playgroud)
然后,我会在其内置的"bisect"模块中使用Python的"bisect_right()"函数,在快速O(log n)时间内查找该列表中查询时间"适合"的位置.然后,查看返回的索引.如果它是偶数(0,2,4 ...),则时间介于"关闭"时间之一和下一个"打开"时间之间,因此商店关闭.相反,如果二分指数是一个奇数(1,3,5 ......),那么时间已经落在开盘和收盘时间之间,并且商店是开放的.
不如位图快,但你不必担心分辨率,我想不出另一个优雅的O(log n)解决方案.
| 归档时间: |
|
| 查看次数: |
1069 次 |
| 最近记录: |