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