gpt4 book ai didi

java - 使用多线程读取30GB文件

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:08 24 4
gpt4 key购买 nike

我正在尝试读取一个 30GB(2500 万行)的大文件。我想编写一个代码来创建一个线程池,每个线程将并行读取 1000 行(第一个线程将读取前 1000 行,第二个线程将读取接下来的 1000 行,依此类推)。我已经读取了整个文件并创建了线程池,但现在我陷入了困境,如何确保每个线程仅读取 1000 行,并跟踪已读取的行号,以便下一个线程不必读取这些行。

最佳答案

A.如果可以接受,所有线程的行数大致相等,您可以:

  1. 假设线程池大小为 N,第一个线程寻求文件偏移 0 并读取 [0, 30GB/N),第二个线程寻求偏移 30GB/N,读取 [30GB/N, 30GB/N*2) 等。
  2. 第二个线程可能不在行的开头,而是在行的中间。没关系。只需跳过部分行,然后阅读完整行。第一个线程可能以部分行结束。没关系,继续读直到读到'\n'。其余线程做同样的事情。

B.如果所有线程必须具有完全相同的行数,即 1000 行,您可以:

  1. 让一个线程读取整个文件,构建索引映射。该 map 具有诸如 line0~line999 从偏移量 0 开始、line1000~line1999 从偏移量 13521 开始等信息...
  2. 所有线程从相应的偏移量处读取文件,共读取 1000 行。

方法 A 读取文件 1 次。方法B读取文件2次。

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

关于java - 使用多线程读取30GB文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38258338/

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