Ich versuche, eine Protokolldatei zu lesen und zu analysieren, die nur CPU verbraucht. Ich habe einen Server, der eine riesige Textdatei 230MB/Sekunde liest, lesen Sie einfach Textdatei nicht analysieren. Wenn ich versuche, die Textdatei zu analysieren, benutze single thread, kann ich die Datei um 50-70MB/Sekunde analysieren.Erhöhung des Festplattenlesedurchsatzes durch Parallelität
Ich möchte meinen Durchsatz erhöhen, diesen Job Nebenläufigkeit. In diesem Code erreichte ich 130 MB/Sekunde. Auf dem Höhepunkt sah ich 190MB/Sekunde. Ich habe BlockedQueue, Semaphore, ExecutionService usw. versucht. Gibt es einen Rat, den Sie mir bei 200MB/Sekunde Durchsatz geben.
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());
}
Danke für Ihren Code. Ich habe Ihren Code getestet, das Ergebnis ist das gleiche. Ich habe diese Art von Code mit ArrayBlockingQueue versucht. Ich denke, ich sollte besser Chunked String Array Solitun verwenden, dass Ralf erwähnt wird. @Tassos –