使用 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 写入)。
我有一个巨大的文件 (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 写入)。