我有~10M行数据,每行包含~1000列(String& Numeric)。我需要的是能够尽可能快地将简单的过滤器(>,<,RANGE,==)应用于此数据集(不到一秒钟就可获得此数据的10K切片)。
可以在Java中使用哪种生产就绪技术?
答案 0 :(得分:0)
您的数据来自哪里?这听起来像是数据库的任务。
答案 1 :(得分:0)
一个sql数据库,其中包含您要过滤的字段的索引。索引可以基于数值,这将使范围和等于查询非常快。
答案 2 :(得分:0)
如果它不是来自数据库, 您可以在几个线程中执行此操作,然后合并结果以提高性能。
就像,这里AMOUNT是地图中的一些元素:
package com.stackoverflow.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Test6 {
private static final int AMOUNT = 10000000;
private static final int CORES = Runtime.getRuntime().availableProcessors();
private static final int PART = AMOUNT / CORES;
private static final class MapFilterTask implements Callable<Map<String,Number >> {
private Integer fromElement;
private Integer toElement;
private Map<String,Number > map;
private MapFilterTask(Map<String,Number > map, Integer fromElement, Integer toElement) {
this.map=map;
this.fromElement = fromElement;
this.toElement = toElement;
}
public Map<String,Number > call() throws Exception {
for(int i=fromElement; i<=toElement; i++){
//filetr your map and return filtered resutl
}
}
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
Map<String,Number > yourMap =new HashMap<String, Number>();
ExecutorService taskExecutor = Executors.newFixedThreadPool(CORES);
List<Callable<Map<String,Number >>> tasks = new ArrayList<Callable<Map<String,Number >>>();
for (int i = 0; i < CORES; i++) {
tasks.add(new MapFilterTask(yourMap,i*PART,(i+1)*PART));
}
List<Future<Map<String,Number >>> futures = taskExecutor.invokeAll(tasks);
Map<String,Number > newMap =new HashMap<String, Number>();
for(Future<Map<String,Number >> feature : futures){
newMap.putAll(feature.get());
}
// Map<String,Numeric>
}
}
对我而言,只有使用VM args才能快4倍: -Xms2048M -Xmx2048M
如果没有VM args,我的笔记本电脑上有4个核心处理器和Linux Mint OS的时间增加了1.7倍。