在Java中,如何有效地计算时间间隔列表中点列表的命中率?
我有一个大约50000点的列表,介于0和250000000之间,还有一个大约10000000个间隔的列表。间隔存储在MySQL数据库中的12个表中 我想计算每个点周围有多少间隔。我尝试了几种方法来做这件事,但我总是遇到问题。如果我想建立一个区间树,它需要很多内存,而简单地遍历列表需要很多时间 我需要在得到一系列分数后10秒钟内得到结果。此外,准备数据库或创建数据结构也不是问题。因此,在只需进行一次准备的情况下,如果这需要更多的时间就可以了在Java中,如何有效地计算时间间隔列表中点列表的命中率?,java,mysql,algorithm,performance,intervals,Java,Mysql,Algorithm,Performance,Intervals,我有一个大约50000点的列表,介于0和250000000之间,还有一个大约10000000个间隔的列表。间隔存储在MySQL数据库中的12个表中 我想计算每个点周围有多少间隔。我尝试了几种方法来做这件事,但我总是遇到问题。如果我想建立一个区间树,它需要很多内存,而简单地遍历列表需要很多时间 我需要在得到一系列分数后10秒钟内得到结果。此外,准备数据库或创建数据结构也不是问题。因此,在只需进行一次准备的情况下,如果这需要更多的时间就可以了 有什么想法吗?我会用文件做这个 创建一个包含2000万条
有什么想法吗?我会用文件做这个
如果您不能及时说服MySQL这样做,您可以使用BerkeleyDB来实现BTREE,然后就这样做。或者,你可以对你的点进行排序,然后与2000万点文件并行扫描该文件。(我想先试试伯克利DB。)没有简单的解决方案。(我相信)如果不扫描每个表的至少一半,就无法直接执行查询。“一半”来自于拥有
索引(开始)、索引(结束)
,并希望优化器能够动态地选择更好的索引。这是“订单(N)”
桶。通过发明“bucket”并确定哪个bucket(或多个bucket)中的间隔,您可以通过询问它位于哪个bucket中,然后在该bucket中扫描开始和结束来搜索点<代码>索引(桶,开始),索引(桶,结束)。但是,它确实需要复制一些行(因为间隔可能跨越多个存储桶)。这是对性能的部分改进,并涉及到插入和选择的一些复杂性。桶的数量成为速度和空间之间的折衷
不重叠。如果你能把它转换成不重叠的区间,那么有一个更好的方法,就是顺序(1)。它确实涉及到插入和选择的复杂性,但存储例程可以隐藏这样的内容
第13个表格。如果您使用bucket或non-overlapping,那么最好使用第13个表进行搜索,从而将复杂性限制在该表中,而不会影响现有的12个表。您的50000分是否始终保持不变?或者你的意思是你需要在10秒内返回50000个新点数的间隔计数吗?@MickMemmonic不,它们总是不同的。每次通话的间隔都是一样的,但每次通话的点数都不一样。是的,我想在最长10秒内返回50000点中每一点的间隔计数。间隔是否重叠?如果是的话,你就一团糟。如果没有,那么我可以给你一个窍门。你有足够的内存来缓存间隔表吗?让我们看看
SHOW CREATE TABLE
@RickJames是的,它们重叠,一些间隔也重复,但它们必须同时计算。12个表,因为它们是从另一个MySQL数据库中获取的,并且按不同的内容分类。每个表大约有12列,但我只需要其中的两列。这两列的SHOW CREATE TABLE
输出是'chromStart'int(10)unsigned NOT NULL默认值“0”
,第二列的'chromEnd'输出是相同的。