如何并行处理大文件而不将所有内容加载到内存中

时间:2019-04-08 02:30:54

标签: python multithreading parallel-processing

我有一个很大的json行文件(每行都是一个json对象)。我想阅读每一行并并行处理每一行。 这是我得到的:

import gzip
import multiprocessing as mp
import pandas as pd
from json import loads

def process_file(file_line):
    json_line = loads(file_line)
    data = json_line.get('data', None)
    if data:
        df = pd.DataFrame(data)
        return df.groupby(['style']).score.describe()
    return pd.DataFrame()

pool = mp.Pool(8)
jobs = []
with gzip.open('2018.jl.gz') as f:
    for line in f:
        jobs.append(pool.apply_async(process_file,(f)))

for job in jobs:
    job.get()

pool.close()

但是,处理所花的时间比读取文件要长,并且最终会添加过多的作业并导致内存问题。
有什么办法可以做到这一点吗?我该如何编码,以使每个线程都抓住一行并处理该行,并在完成时又捕获一个新行,并且如果所有线程都在忙,循环将暂停?

0 个答案:

没有答案