内存中的单表数据库算法或库

时间:2015-04-06 18:33:30

标签: java algorithm data-structures

从我试图解决的问题开始:

  • 给出一个扁平的表格式结构(行和列) 小尺寸数据(少于50,000行)
  • 我需要在给定列索引数组的情况下快速找到匹配的行 使用精确的相等匹配。 (通常2-3列 参与给定的查询)
  • 针对所有必须完成的数据,最多1000个查询 1秒
  • 数据可以批量附加或异步更新 将再次启动查询
  • 查询可以(理想情况下)并行运行
  • 正在运行查询时数据是不可变的
  • 基于Java

我查看了一些内存数据库,如H2和VoltDB,但SQL开销主导了搜索,即使使用PreparedStatements也是如此。不可变Object [] []的全表扫描可以解决一个问题,但会在表中留下很多优化(比如索引)。如果我开始构建索引和marge-sets,感觉就像是在重新发明数据库。

对可以处理此问题的现有开源库或数据结构的任何建议?或者我最好继续我在这里发明的""接近并开始滚动我自己的索引?对于我在这里发明的""方法,我使用Object [] []获取数据并对其进行编码(使用Akka并行高达1000x):

public int[] findMatchingRows(int[] columnIndex, Object[] columnValues){
   List<Integer> matchingRows = new ArrayList<Integer>();
   for(int row=0;i<data.length; row++){
     boolean found = true;
     for(int colIdx=0;j<columnIndex;colIdx++){
         if(!matches(data[row][columnIndex[colIdx], columnValues[colIdx]){
            found = false;
            break;
         }
     }
     if(found){
       matchingRows.add(row);
     }
   }
   return matchingRows;
}

1 个答案:

答案 0 :(得分:0)

一个简单的手动方法是,对于每个“索引”列,将所有行放入HashMap<ColumnType, HashSet<Row>>,以便每个不同的键值映射到具有该键值的所有行的列表中柱。可以通过获取查询中的键值的所有HashSet<Row>并获取它们的交集来执行查询。

此预期时间复杂度为 O(km),其中 k 是查询中的键数, m 是来自任何键列的最大命中数。