读取外部进程错误流严重影响性能

2024-09-30 22:09:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Java程序,它(包括其他东西)使用输入流从外部Python应用程序读取数据。你知道吗

下面是我用来阅读的代码:

InputStreamReader isr = new InputStreamReader(p.getInputStream()),
            isrError = new InputStreamReader(p.getErrorStream());

BufferedReader br = new BufferedReader(isr), brError = new BufferedReader(isrError);
new Thread() {
    @Override
    public void run() {
        try {
            while (brError.readLine() != null);

        } catch (Exception e) {
        }
    }
}.start();
while ((line = br.readLine()) != null) { //line is a previously declared String
    //do whatever with line
}

我创建线程来读取错误流,因为Python应用程序在出错时抛出错误(我不能编辑它,它是第三方软件),并且由于某种原因,如果我不读取错误流,InputStream最终会被阻塞。你知道吗

有没有办法让while (brError.readLine() != null);对性能的影响更小?你知道吗

现在我正在研究VisualVM的性能,虽然Java软件通常保持在0-5%的CPU使用率之间,这很不错,但是大约60-65%的CPU使用率被这个线程中的这个循环使用,它的唯一功能是防止主循环阻塞。我需要尽可能地提高性能(这将进入工业生产线,因此正确使用资源非常重要)。你知道吗

谢谢大家。你知道吗


Tags: br应用程序newreadline错误linejava性能
2条回答

您将丢弃流转换为不必要的字符,这可能有点昂贵,尤其是在使用UTF-8时(无论如何,这取决于平台编码通常是错误的)。你知道吗

删除Reader,使用BufferedInputStream作为丢弃流。你知道吗

但是,对于外部进程,重定向肯定是优越的,因为Java中根本没有处理。你知道吗

为便于处理(如果运行时不需要内容),请使用ProcessBuilder中的redirectError(File)。你知道吗

ProcessBuilder pb = new ProcessBuilder("foo", "-bar");
pb.redirectError(new File("/tmp/errors.log"));
pb.start();

如果您正从while (brError.readLine() != null);获得cpu旋转,那么应该查看错误流返回的内容。因为readLine()是一个阻塞调用,这意味着错误流将输出大量的行。你知道吗

相关问题 更多 >