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)