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

标签 java multithreading java.util.concurrent

我有一个巨大的文件(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/

相关文章:

java - Spring:对构造函数\setter注入(inject)的循环依赖

c++ - 如何等待多个线程完成(使用 C++11 线程)?

c++ - 使用线程的段错误

java - 如果多个 JVM 或容器访问共享内存,如何在 Java 中实现线程安全?

java - 用于索引访问的线程安全集合

java - 为什么ExecutorService方法invokeAny()在每次运行的程序上都处理不同数量的任务?

Java从网上复制源代码,粘贴到Eclipse并运行

java - 使用 Json 请求调用 PostMapping 时出现 NoSuchMethod 错误

java - 在 Kotlin 中,为什么我的每个 Float 占用 128 位而不是 16 位?

c++ - 使用 gtest EXPECT_CALL 时出现竞争条件段错误,而另一个期望正在执行相同的方法