Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 并行化大CSV文件处理_Python_Numpy_Multiprocess - Fatal编程技术网

Python 并行化大CSV文件处理

Python 并行化大CSV文件处理,python,numpy,multiprocess,Python,Numpy,Multiprocess,编辑:解决方案 我首先使用splitbash函数将文件拆分为10000行。 然后: 我正在处理几个非常大的CSV文件(其中74个,10GB到65GB),需要逐行读取它们以从中提取数据并将其放入矩阵中 我使用的是Python,因为使用C/C++解析带有空字段和JSON字段的CSV文件并不容易 我现在正在做的是使用线程池,但它看起来并没有将CPU使用到最大容量(Xeon E5),我认为这可能是因为矩阵填充 M = np.zeros((users.size, levels.size, 2)) def

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

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

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

我现在正在做的是使用线程池,但它看起来并没有将CPU使用到最大容量(Xeon E5),我认为这可能是因为矩阵填充

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个月才能完成。

你可以开始使用
pandas
df=pd.read_csv(“level{}.csv.format(level))
打开每个文件,然后选择列(比如说
col1
col2
,…),并通过
mat=df[[col1]提取值矩阵,“col2”].值


考虑到文件的大小,我建议您使用
dask.dataframe
来处理每个文件并将矩阵保存在一个好的格式上。然后您可以使用
dask.array
来处理矩阵。您可以开始使用
pandas
打开每个文件作为
df=pd.read\u csv(“level{}.csv.format(level))
然后选择列(比如说
col1
col2
,…),并通过
mat=df[[“col1”,“col2”]]提取值矩阵。值


考虑到文件的大小,我建议您使用
dask.dataframe
来处理每个文件,并将矩阵保存在一个好的格式上。然后您可以使用
dask.array

来处理矩阵。您是否测量了您花在I/O上的时间与花在CPU计算上的时间(磁盘I/O是按顺序进行的,因此如果这是您的瓶颈,那么您的代码可能无法完成很多工作)您应该将文件分发到不同的进程,而不是文件行,并且应该使用多处理,而不是multithreading@BlackBear我该怎么做?每次我尝试时都会遇到奇怪的终端故障,我认为这可能是因为所有进程都访问同一个矩阵?请分析它。在这方面花费的大部分时间在哪里单线程?您是否测量过您花费在I/O上的时间与花费在CPU计算上的时间(磁盘I/O是连续的,所以如果这是您的瓶颈,那么您的代码可能无法完成很多工作)您应该将文件分发到不同的进程,而不是文件行,并且应该使用多处理,而不是multithreading@BlackBear我该怎么做?每次我尝试时都会遇到奇怪的终端故障,我认为这可能是因为所有进程都访问同一个矩阵?请分析它。在这方面花费的大部分时间在哪里一根线?
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)