Java:并发读取 InputStream

标签 java performance concurrency inputstream

现在已经四处寻找了一段时间,我对这个问题有点困惑。我希望能够获取输入流并分段同时读取它。这些段不会相互交互,它们只是要从上传的文件插入或更新到数据库中的值。是否可以通过设置段大小来并发读取输入流,然后在分拆新线程以处理转换和插入/更新之前向前跳过?

本质上,该文件是一个 ID 列表(每行一个 ID),但如果我可以指定一个分隔符则更好。有些文件可能很大,所以我想处理数据并将其转换成段,以便在插入/更新数据库后可以释放 JVM 内存。这可能吗?如果是这样,是否有任何图书馆已经这样做了?

提前干杯和感谢,

阿列克谢蓝。

最佳答案

一个好的方法可能是让一个读取器读取 block ,然后将每个 block 交给线程池中的工作线程。鉴于这些将被插入到数据库中,与读取输入相比,插入将是迄今为止最慢的部分,因此单个线程应该足以读取。

下面是一个示例,它将每一行的处理从 System.in 移交给工作线程。如果您在单个事务中执行大量插入,则数据库插入的性能会好得多,因此传入一组(比如 1000 行)会比传入示例中的一行要好。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static class Worker implements Runnable {
        private final String line;

        public Worker(String line) {
            this.line = line;
        }

        @Override
        public void run() {
            // Process line here.
            System.out.println("Processing line: " + line);
        }
    }

    public static void main(String[] args) throws IOException {
        // Create worker thread pool.
        ExecutorService service = Executors.newFixedThreadPool(4);

        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        String line;

        // Read each line and hand it off to a worker thread for processing.
        while ((line = buffer.readLine()) != null) {
            service.execute(new Worker(line));
        }
    }
}

关于Java:并发读取 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16159183/

相关文章:

concurrency - Clojure 中标准输出的同步

java - 无法在某部手机上安装 apk

java - 如何从源代码构建 Mojarra

java - jack 兔子 java.lang.OutOfMemoryError : Java heap space

java - 从 String-Json 对象中获取值

performance - Datomic中的查询结果分页

java - SwingWorker要更新TreeModel吗?

java - 如何使用 java 在 linux 中打印根目录中的文件和文件夹列表

PHP OPcache 优化级别 - 它们是什么?

java - 给定数据库结构可以在运行时更改,如何处理并发 SQL 更新