Java:过滤大量数据

时间:2014-11-18 13:55:09

标签: java filtering bigdata

我有~10M行数据,每行包含~1000列(String& Numeric)。我需要的是能够尽可能快地将简单的过滤器(>,<,RANGE,==)应用于此数据集(不到一秒钟就可获得此数据的10K切片)。

可以在Java中使用哪种生产就绪技术?

3 个答案:

答案 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倍。