编辑:解决方案
我首先使用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个月才能完成。
答案 0 :(得分:0)
您可以开始使用pandas
以df = pd.read_csv("level{}.csv".format(level))
的形式打开每个文件,然后选择各列(让我们说col1
,col2
,...)并通过提取值矩阵mat = df[["col1", "col2"]].values
鉴于文件的大小,我建议您使用dask.dataframe
处理每个文件,并将矩阵保存为漂亮的格式。然后,您可以使用dask.array