使用多线程读取30GB文件

时间:2016-07-08 03:05:59

标签: java multithreading

我正在尝试读取一个30GB(2500万行)的巨大文件。我想写一个代码,它将创建一个线程池,每个线程将并行读取1000行(第一个线程将读取前1000行,第二个线程将读取下一个1000,依此类推)。 我已经阅读了整个文件并创建了线程池但是现在我被困住了,我怎么能确保每个线程只读取1000行并且还跟踪已读取的行号,以便下一个线程不必读取那些线。

1 个答案:

答案 0 :(得分:0)

一个。如果它是可加入的,则所有线程的行数大致相等,您可以:

  1. 假设线程池大小为N,第一个线程寻找文件偏移0并读取[0,30GB / N),第二个线程寻求偏移30GB / N,读取[30GB / N,30GB / N * 2]等
  2. 第二个线程可能不在一行的开头,而是在一行的中间。没关系。只需跳过paritial行,然后阅读完整的行。第一个线程可以以部分线结束。没关系,只需继续阅读,直到阅读' \ n'。剩余的线程做同样的事情。
  3. B中。如果所有线程必须具有完全相同的行数,那么说1000行,您可以:

    1. 让一个线程读取整个文件,构建索引图。地图的信息如line0~line999从偏移0开始,line1000~line1999从偏移13521开始等等......
    2. 所有线程从相应的偏移量中读取文件,并读取1000行。
    3. 方法A读取文件1次。方法B读取文件2次。

      使用方法A或B,您可以让所有线程并行处理文件(转换,提取,清理......)。但是如果处理速度非常快,那么界限就是磁盘速度。然后你的应用程序是IO绑定的。你应该只有一个线程读取文件并按顺序进行处理。