读取大文件并通过多线程处理

时间:2019-10-08 10:09:29

标签: java multithreading gson

我正在尝试使用JSON行读取大型文件(以GB为单位),进行一些“处理”并将结果写入另一个文件。 我将为此目的使用GSON streaming API 为了加快处理速度,我想对“处理”部分进行多线程处理。 我无法逐行读取文件,因为无法将整个文件加载到内存中。我的“处理”取决于满足特定条件的两条不同的线(可能相隔数千行)。是否可以在不将整个内容加载到内存的情况下对这个“处理”进行多线程处理?

2 个答案:

答案 0 :(得分:1)

我认为您将从文件中读取一个进程,从而将工作线程(Runnable / Callable)添加到队列中。然后,您有一个线程池,该线程池从队列中消耗并并行执行工作线程。

请参阅Executors静态方法,这些方法可以帮助创建ExecutorService

答案 1 :(得分:1)

  

关于如何执行此操作的任何建议?

更好的设计是使用读取器线程,写入器线程和ExecutorService实例进行处理。

  • 读取器线程使用流式API 1 读取JSON文件。确定要执行的工作单元后,它将创建任务并将其提交给执行者服务,然后重复执行。

  • 执行器服务器处理给定的任务。您应该使用具有受限线程池的服务,并可能使用有界/阻塞工作队列。

  • writer线程扫描由任务提交创建的Future对象,并使用它们来获取任务结果(按顺序),从结果生成输出并将输出写入文件。 / p>

如果不需要按顺序输出文件,则可以省去编写器线程 2 ,并将任务写入文件。他们将需要使用共享锁或互斥锁,以便一次只能将一个任务写入文件。

1-如果不这样做,则:1)您需要能够将整个输入文件解析并保存在内存中,并且2)阅读器线程将无法开始提交任务,直到它已经完成了对输入的解析。

2-如果这样做是为了简化操作,而不是出于性能原因。写作时需要相互排斥会杀死任何假想的绩效收益。


如@Thilo所述,尝试拥有多个读取器线程几乎无济于事。 (如果您尝试的话,则非常复杂!)