我必须在服务器(不是我的计算机)上处理这个非常大的文件。它运行 python 64 并拥有 24 GB RAM。文件本身大小约为 13GB,包含 2700 万行数据。考虑到服务器有相当大的规格,我确实尝试将整个服务器加载到 pandas,但它崩溃了。我尝试使用dask,但它仍然很慢。所以我将文件分成如下所示的块。
我的代码与下面的类似。我以块的形式加载文件,每个块有 100,000 行数据。然后它将处理每个块,并将其附加到现有文件中。我认为通过分块处理事物,它不会将数据存储在 RAM 中,但我认为它仍然如此。前几百次迭代运行良好,但在处理 8GB 数据后的某个时候,它就崩溃了。
chunksize= 100000
c = 0
for chunk in pd.read_csv(fname, chunksize=chunksize,sep='|',error_bad_lines=False):
chunk['col1'] = chunk['col1'].apply(process1)
chunk['col2'] = chunk['col2'].apply(process2)
if c == 0:
chunk.to_csv("result/result.csv", index=False)
else:
chunk.to_csv('result/result.csv', mode='a', header=False, index=False)
if c%10==0:
print(c)
c+=1
通常,经过 160 次迭代(生成 8 GB 的 result.csv 文件)后,程序会停止并显示 .csv 文件MemoryError:。
老实说,我无权访问该服务器中的许多内容,因此,如果您想建议更改我无权访问的某些设置,那么我可能不能。但让我们看看我能做什么。提前致谢。
process1编辑:我将添加这里和这里发生的事情process2。
def process1(name):
if type(name)==str:
new_name = name[:3]+'*' * len(name[:-3])
else:
return name
return new_name
def process2(number):
if number !=np.nan:
new_number = str(number)
new_number = '*'*len(new_number)
return new_number
else:
return number
慕哥6287543
相关分类