使用 Java 并发从大文件 (2GB) 读取并写入另一个文件

Reading from large file (2GB) and writing to another file using Java concurrency

我有一个巨大的文件 (2GB),其中仅包含员工编号。我必须读取此文件并获取员工编号并调用数据库以获取员工的薪水,然后将其写入另一个文件,其中员工姓名和薪水作为其行。

现在的问题是,通过 java 中的简单 nio 直接读取这个巨大的文件,我的 STS 内存不足,或者需要 4-5 小时才能完成整个读取-获取-写入过程。

所以我想用 Java 并发来拯救我。

因为我有一个 class 实现 Runnable 的 EmployeeDetails,在它的主要方法中,我创建了一个核心大小和最大大小为 2 的线程池执行程序, 指定超时并通过阻塞队列。

BlockingQueue workQueue = new LinkedBlockingQueue();
In ThreadPoolExecutor along with corePoolSize=2 , maximumPoolSize =20 , keepAliveTime  = Long.MAX_VALUE, workQueue is been passed.

然后创建了 inputFile 文件对象以从我需要写入数据的路径和 outputFile 对象获取输入文件。

然后我创建了两个 EmployeeDetails 对象,

EmployeeDetails readFile = new EmployeeDetails(inputFile);
EmployeeDetails writeFile = new EmployeeDetails (outputFile);

然后 ThreadPoolExecutor. submit(readFile)ThreadPoolExecutor submit (writeFile ) 打电话了。

在 class EmployeeDetails 中,我创建了 运行 方法, 运行方法打开数据库连接, 然后 BufferedReader 获取文件, while 循环是 运行 直到 br.readLine() !=null 然后为每个员工调用 db 以获取薪水,因为员工在不同的分片 (MySQL) 中,因此它的薪水。

取回薪水后,我将其放入列表中,一旦列表大小为 10000。我需要等待一个线程并调用 wrie 线程将其写入文件并刷新列表以获得另一个 10000记录,这就是问题所在。

请建议一种从文件中读取 10000 条记录的方法,调用数据库获取详细信息,然后填充列表,一旦他列出 10000 条记录,调用写入线程来获取列表并写入另一个文件。

我认为仅拆分文件读取和写入不会显着提高性能。

而是考虑将实际工作(从数据库中获取数据)拆分为线程。

在开始时创建 ExecutorService 并从原始线程开始逐行读取行并包装到 Callable 中执行提取并将它们传递给执行程序服务。将生成的 Future 传递给 LinkedBlockingQueue ,它将被编写器线程使用。那将等待传入的期货并写入结果(这是为了保持顺序,否则你可以直接从 Callable 写入)。