如何实现一个延迟的并行文件读取?


#1

1. 背景

现在我有1000个不小于1GB的CSV文件,我需要对这些文件中的数据分别进行读取并计算导出(各个文件的计算独立)。现在测试了一下,发现在单线程的情况下,读文件在10秒左右,计算在3秒左右。我分别试过在计算部分和读文件部分使用并行计算,但是发现并行所需的时间远超单线程的时间。我觉得主要问题是多线程读取文件可能受限于磁盘的 I/O 速率。

现在我想实现如下的功能:

2. 需求描述

多个进程/线程并行运算,首先 1 进程单独运行,其他进程等待(使其他并行进程不读取文件),当 1 进程读取文件完毕之后进行计算,此时磁盘 I/O 占用低,启动进程 2 读取文件(还是使其他并行进程不读取文件),然后计算。以此类推,各个线程排队读取文件

请问这样的需求需要如何实现?

附录

下面附上我原始读取文件的代码:

function getData(path::String)
    dfTable = CSV.File(string(path, "/", "particle_lists.oscar"), 
                    delim=' ', comment="#", 
                    header=["t", "x", "y", "z", "mass", "p0", "px", "py", "pz", "pdg", "ID", 
                        "charge"]) |> DataFrames.DataFrame
    return dfTable
end

#2

换一种方法可能更好操作一点。

开一个线程只负责读文件,读完一个,就另开一个线程开始计算。