Java 对于大型数据集,有效地检查子字符串
我有:Java 对于大型数据集,有效地检查子字符串,java,cassandra,substring,cassandra-3.0,Java,Cassandra,Substring,Cassandra 3.0,我有: 具有400000行的数据库表(Cassandra 3) 大约10000个关键字的列表 预计这两个数据集将随着时间的推移而增长 我需要: 检查指定列是否包含关键字 求和列中包含关键字的行数 我应该选择哪种方法 方法1(二级索引): 创建二级 随时查找给定关键字“动态”的匹配项 然而,我害怕 capcapacity问题-二级索引可能会占用额外的空间,对于如此大的表来说可能会太多 性能-我不确定是否可以在合理的时间内找到数亿行中的关键字 方法2(Java作业-暴力): 连续迭
- 具有400000行的数据库表(Cassandra 3)
- 大约10000个关键字的列表
- 预计这两个数据集将随着时间的推移而增长
- 检查指定列是否包含关键字
- 求和列中包含关键字的行数
- 创建二级
- 随时查找给定关键字“动态”的匹配项
- 然而,我害怕
- capcapacity问题-二级索引可能会占用额外的空间,对于如此大的表来说可能会太多
- 性能-我不确定是否可以在合理的时间内找到数亿行中的关键字
- 连续迭代数据的Java作业
- 匹配项保存到缓存中
- 缓存在下一次迭代中更新
// Paginate throuh data... String page = null; do { PagingState state = page == null ? null : PagingState.fromString(page); PagedResult<DataRow> res = getDataPaged(query, status, PAGE_SIZE, state); // Iterate through the current page ... for (DataRow row : res.getResult()) { // Skip empty titles if (row.getTitle().length() == 0) { continue; } // Find match in title for (String k : keywords) { if (k.length() > row.getTitle().length()) { continue; } if (row.getTitle().toLowerCase().contains(k.toLowerCase()) { // TODO: SAVE match break; } } } status = res.getResult(); page = res.getPage(); // TODO: Wait here to reduce DB load } while (page != null);
//通过数据分页。。。 字符串页=null; 做{ PagingState state=page==null?null:PagingState.fromString(第页); PagedResult res=getDataPaged(查询、状态、页面大小、状态); //遍历当前页面。。。 对于(DataRow行:res.getResult()){ //跳过空标题 if(row.getTitle().length()==0){ 继续; } //在标题中查找匹配项 for(字符串k:关键字){ if(k.length()>row.getTitle().length()){ 继续; } if(row.getTitle().toLowerCase().contains(k.toLowerCase()){ //TODO:保存匹配 打破 } } } status=res.getResult(); page=res.getPage(); //TODO:在此处等待以减少数据库负载 }while(page!=null);
- 问题
- 遍历整个表可能非常慢,如果每1000行等待一秒钟,那么这个循环将在4.6天内完成
- 这将需要额外的缓存空间;此外,频繁地从缓存中删除将在Cassandra中生成墓碑
如何运行选项2一次并创建缓存(可以是外部资源),对于将来的更新,使用过滤机制在存储数据后更新缓存谢谢,您能否更具体地说明“轻松地将数据从cassandra转储到Elasticsearch”?