当前位置: 首页 > 知识库问答 >
问题:

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

蒙才
2023-03-14

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

现在的问题是,通过直接读取这个巨大的文件通过简单的nio在java我的STS内存溢出或它需要4-5小时来完成整个读-取-写过程。

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

为此,我有一个实现Runnable的EmployeeDetails类,在其主方法中,我创建了一个线程池执行器,核心大小和最大大小为2,指定超时并传递阻塞队列。

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

然后创建inputFile对象,从需要写入数据的path和outputFile对象获取输入文件。

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

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

然后是ThreadPoolExecutor。提交(readFile)线程池执行器提交(writeFile)调用。

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

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

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

共有1个答案

周飞语
2023-03-14

我不认为它仅仅对文件的读写进行分割就可以显著提高性能。

而是考虑将实际的工作从DB分割成线程。

在开始时创建ExecutorService,从原始线程开始,只需逐个读取这些行,并将它们包装到Callable中,然后进行提取,并将它们传递给executor服务。将生成的未来传递到写入线程将使用的LinkedBlockingQueue。这将等待传入的futures并写入结果(这是为了保持顺序,否则您可以直接从Callable写入)。

 类似资料:
  • 我正在尝试转换一个大的文本文件(大小为5 gig),但得到了一个从这篇文章中,我设法将文本文件的编码格式转换为可读的格式: 这里的问题是,当我试图转换一个大尺寸(5 GB)的文本文件时。我会得到这个错误 我知道它无法读取这么大的文件。我从几个链接中发现,我可以逐行阅读。 那么,我如何应用于我必须让它逐行读取的代码呢?我对逐行读取的理解是,我需要从中读取一行,并将其添加到中,直到行尾,对吗?

  • 我有从多个文件读取并写入多个文件的Spring批处理配置。是否可以只写入从多个读取的一个文件。假设我收到巨大的XML文件,我将XML拆分为小文件并使用分区器并行读取小文件。但我需要将从不同的小xml文件读取的所有数据写入一个输出文件。Spring批处理是否可以做到这一点?我知道通过使写入器同步是可能的,但我正在寻找任何其他可能的方式作业配置 我得到错误组织。springframework。一批项目

  • 档案员。txt包含两类员工的详细信息,即月薪和小时津贴。如果是月薪员工,则该文件包含名字、姓氏、性别、职级、类型和基本工资,如果是小时薪员工,则包含小时工资和工作小时数。该文件的示例如下所示: 约翰·史密斯M经理每月45000.00 Sunil Bates M高级每小时700.00 45 梁爱娃F警官每月30500.00 我要写一个程序,会看每个员工,计算奖金占基本工资的百分比,对于一个按小时计酬

  • 我正在编写一个java代码,它利用Apache-poi读取ms-office.doc文件,利用itext jar API创建并写入pdf文件。我已经阅读了.doc文件中打印的文本和表格。现在我正在寻找一个读取文档中写入的图像的解决方案。我已经编写了如下代码来读取文档文件中的图像。为什么这段代码不起作用。 存在的问题是:1。条件if(Picture.HasPicture(run))不满足,但文档具有

  • 问题内容: 我正在尝试运行一个应用程序(例如),因此它将从文件中读取stdin并从stdout写入另一个文件。 目前我有 它可以按预期工作,因为我可以对该文件进行某些操作,并且top可以接收它。但是我无法重定向top的输出。我该如何实现? 编辑: 好吧,让我们从头开始。我正在测试: 问题答案: 让我们忘掉这似乎是一条红色的鲱鱼。 要将stdin或stdout映射到文件,可以使用重定向: 甚至:

  • 问题内容: 如何使用框架有效地从大文件读取并将大数据写入文件。 我工作,并和曾尝试类似如下: 谁能告诉我,如果我的文件大小超过2 GB,我应该遵循相同的步骤吗? 如果大量的书面操作,我想在写作时做类似的事情,该怎么办? 问题答案: 请注意,您可以像示例代码那样简单地用于复制文件,只是速度更快,而且仅一行代码。 否则,如果您已经打开了两个文件通道,则可以使用 将该通道的全部内容传输到该通道。请注意,