并行处理大型CSV文件过程

时间:2019-02-22 14:15:19

标签: python numpy multiprocess

编辑:解决方案 我首先使用split bash函数将文件分成10000行。 然后:

with Pool(processes=32) as pool:
    for level in range(75):
        all_results=[]
        for f in level_dir:
            res = pool.apply_async(process_file, args=[f, level]
            all_results.append(res)
        for res in all_results:
            res.get()
        save_matrix()

我正在处理几个非常大的CSV文件(其中74个,从10GB到65GB),并且需要逐行读取它们以提取数据并将其放入矩阵中。

我使用的是Python,因为使用C / C ++解析具有空字段以及JSON字段的CSV文件并不容易。

我现在正在执行的操作是使用ThreadPool,但看起来并不能完全使用CPU(至强E5),这可能是因为矩阵填充。 / p>

M = np.zeros((users.size, levels.size, 2))

def process_line(row):
    data    = json.loads(row[3])
    usr     = data['usr']
    #compute stuff
    M[usr, level, 0] = score
    M[usr, level, 1] = t_len

def main():
    for level in range(75):
        csv_f  = open("level{}.csv".format(level))
        reader = csv.reader(csv_f)
        t      = ThreadPool(processes=32)
        for row in reader:
            t.map(process_line, (row, level, ))
        t.join()
        t.close()
    np.save("matrix.npy", M)

当我在每个行进程中打印时间戳时,看起来更改进程数并没有什么改变,这和不使用ThreadPool时一样慢。

如何使我的代码运行更快?

如果我继续这样做,实际上需要3个月才能完成。

1 个答案:

答案 0 :(得分:0)

您可以开始使用pandasdf = pd.read_csv("level{}.csv".format(level))的形式打开每个文件,然后选择各列(让我们说col1col2,...)并通过提取值矩阵mat = df[["col1", "col2"]].values

鉴于文件的大小,我建议您使用dask.dataframe处理每个文件,并将矩阵保存为漂亮的格式。然后,您可以使用dask.array

处理矩阵