【发布时间】:2013-05-04 18:10:03
【问题描述】:
我有一个计费守护程序,它必须以非常快速的方式处理数十万条数据。我为并行处理实现了ExecutorSerivce。它确实提高了速度,但不是很多。处理 1,00,000 条记录大约需要 2.5-3 小时。我怎样才能让它更快,比如在半小时内处理这些数据?
我写了以下执行设置:
-Xms2048M -Xmx2048M -XX:MaxPermSize=256m
我尝试实现一个生产者消费者模型,其中包含 1 个生产者和 4 个消费者。每个列表可以包含 10,000 条记录。
ArrayBlockingQueue<BillableList> list =new ArrayBlockingQueue<BillableList>(10);
ExecutorService threadPool = Executors.newFixedThreadPool(5);
threadPool.execute(new Consumer("pool1", list));
threadPool.execute(new Consumer("pool2", list));
threadPool.execute(new Consumer("pool3", list));
threadPool.execute(new Consumer("pool4", list));
Future producerStatus = threadPool.submit(new Producer("Producer", list));
producerStatus.get();
threadPool.shutdown();
在将记录更新到数据库时,我还会收到很多“超出数据库锁定等待超时”异常。是不是因为不同的消费者同时尝试为同一个用户?如何让不同的消费者从ArrayBlockingQueue的列表中获取不同的数据?
【问题讨论】:
-
第 1 步:找出运行缓慢的原因。记录高级操作的执行时间,使用分析器,进行 GC 日志记录以查看您是否正在浪费内存...
-
为数据库获取一个非常快速的 SSD 阵列。
-
还有~purrrrformance~~~~
标签: java multithreading