java - In-Memory单表数据库算法或库

标签 java algorithm data-structures

从我要解决的问题开始:

  • 给定一个类似平面表格的结构(行和列) 数据量较小(少于 50,000 行)
  • 我需要在给定列索引数组的情况下快速找到匹配的行 使用精确相等匹配。 (通常会有 2-3 列 涉及给定的查询)
  • 最多 1000 个针对所有必须在其中完成的数据的查询 1秒
  • 数据可以批量添加或异步更新
    将再次开始查询
  • 查询可以(理想情况下应该)并行运行
  • 在运行查询时数据是不可变的
  • 基于 Java

我查看了一些内存数据库,如 H2 和 VoltDB,但 SQL 开销在搜索中占主导地位,即使使用 PreparedStatements 也是如此。不可变 Object[][] 的全表扫描在一定程度上可以工作,但在表中留下了很多优化(比如索引)。如果我开始构建索引和边缘集,感觉就像我在重新发明数据库。

对于可以处理此问题的现有开源库或数据结构有什么建议吗?还是我最好继续我的“在这里发明”方法并开始滚动我自己的索引?对于我的“在这里发明”的方法,我使用 Object[][] 来处理数据并对其进行编码(使用 Akka 并行高达 1000 倍):

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;
}

最佳答案

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

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

关于java - In-Memory单表数据库算法或库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29477310/

相关文章:

java - iOS 和 Java 之间的公钥交换

python - Bisect/Insort 的列表和双端队列的时间复杂度是否不同?

algorithm - 二维房屋强盗算法

java - 跳过 M 个元素并从 LinkedList 中删除 N 个元素,跳过 0 引发问题

java - RequestFactory 在 Android 上运行缓慢

java - 如何在 Google map 中查找多边形的中心纬度(Android、Java)

Java Swing JPanel 尺寸

java - java算法是用C实现的还是用java实现的?

algorithm - 选择和过滤算法

python - 字典和哈希表之间的真正区别是什么?