【发布时间】:2017-09-08 08:21:49
【问题描述】:
我正在尝试读取一个日志文件并解析它,它只消耗 CPU。我有一个服务器,它以 230MB/秒的速度读取一个巨大的文本文件,只读取文本文件而不解析。当我尝试使用单线程解析文本文件时,我可以解析文件大约 50-70MB/秒。
我想增加我的吞吐量,同时完成这项工作。在这段代码中,我达到了 130 MB/秒。在高峰期,我看到了 190MB/秒。我尝试了 BlockedQueue、Semaphore、ExecutionService 等。你有什么建议可以让我达到 200MB/秒的吞吐量。
public static void fileReaderTestUsingSemaphore(String[] args) throws Exception {
CustomFileReader reader = new CustomFileReader(args[0]);
final int concurrency = Integer.parseInt(args[1]);
ExecutorService executorService = Executors.newFixedThreadPool(concurrency);
Semaphore semaphore = new Semaphore(concurrency,true);
System.out.println("Conccurrency in Semaphore: " + concurrency);
String line;
while ((line = reader.getLine()) != null)
{
semaphore.acquire();
try
{
final String p = line;
executorService.execute(new Runnable() {
@Override
public void run() {
reader.splitNginxLinewithIntern(p); // that is the method which parser string and convert to class.
semaphore.release();
}
});
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally {
semaphore.release();
}
}
executorService.shutdown();
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
System.out.println("ReadByteCount: " + reader.getReadByteCount());
}
【问题讨论】:
标签: java concurrency java.util.concurrent