Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何有效地计算时间间隔列表中点列表的命中率?_Java_Mysql_Algorithm_Performance_Intervals - Fatal编程技术网

在Java中,如何有效地计算时间间隔列表中点列表的命中率?

在Java中,如何有效地计算时间间隔列表中点列表的命中率?,java,mysql,algorithm,performance,intervals,Java,Mysql,Algorithm,Performance,Intervals,我有一个大约50000点的列表,介于0和250000000之间,还有一个大约10000000个间隔的列表。间隔存储在MySQL数据库中的12个表中 我想计算每个点周围有多少间隔。我尝试了几种方法来做这件事,但我总是遇到问题。如果我想建立一个区间树,它需要很多内存,而简单地遍历列表需要很多时间 我需要在得到一系列分数后10秒钟内得到结果。此外,准备数据库或创建数据结构也不是问题。因此,在只需进行一次准备的情况下,如果这需要更多的时间就可以了 有什么想法吗?我会用文件做这个 创建一个包含2000万条

我有一个大约50000点的列表,介于0和250000000之间,还有一个大约10000000个间隔的列表。间隔存储在MySQL数据库中的12个表中

我想计算每个点周围有多少间隔。我尝试了几种方法来做这件事,但我总是遇到问题。如果我想建立一个区间树,它需要很多内存,而简单地遍历列表需要很多时间

我需要在得到一系列分数后10秒钟内得到结果。此外,准备数据库或创建数据结构也不是问题。因此,在只需进行一次准备的情况下,如果这需要更多的时间就可以了


有什么想法吗?

我会用文件做这个

  • 创建一个包含2000万条记录的文件,列出端点的位置,以及从左到右是+1间隔(间隔的开始)还是-1间隔(间隔的结束)
  • 按位置对该文件进行排序
  • 在文件中运行一次,并为每个位置发出一条记录,其中包含位置、其左侧有多少个端点以及在该点上有多少个端点
  • 使用BTREE索引将该文件的内容放入数据库中
  • 现在,对于每个点,您可以使用索引查找最后一个位置大于或等于您的点的记录。然后根据需要访问正确的字段


    如果您不能及时说服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'输出是相同的。