gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:57 26 4
gpt4 key购买 nike

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

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

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

为此,我有一个类 EmployeeDetails ,它实现了 Runnable ,在它的 main 方法中,我创建了一个线程池执行器,其核心大小和最大大小为 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 )已调用。

在类里面EmployeeDetails ,我创建了 run 方法,run方法打开数据库连接,然后 BufferedReader 获取文件,while 循环运行直到 br.readLine() !=null然后为每个员工调用数据库来获取工资,因为员工位于不同的分片(MySQL)中,因此其工资也是如此。

一旦检索到工资,我就把它放入一个列表中,一旦列表大小达到 10000,我需要等待一个线程并调用 wrie 线程将其写入文件并刷新列表以获取另外 10000 条记录,这就是问题。

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

最佳答案

我认为仅拆分文件的读写不会带来显着的性能提升。

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

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

关于java - 使用 Java 并发读取大文件 (2GB) 并写入另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33375507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com