为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 python 中处理非常大的文件(13GB)而不崩溃?

如何在 python 中处理非常大的文件(13GB)而不崩溃?

收到一只叮咚 2023-12-12 21:43:11
我必须在服务器(不是我的计算机)上处理这个非常大的文件。它运行 python 64 并拥有 24 GB RAM。文件本身大小约为 13GB,包含 2700 万行数据。考虑到服务器有相当大的规格,我确实尝试将整个服务器加载到 pandas,但它崩溃了。我尝试使用dask,但它仍然很慢。所以我将文件分成如下所示的块。我的代码与下面的类似。我以块的形式加载文件,每个块有 100,000 行数据。然后它将处理每个块,并将其附加到现有文件中。我认为通过分块处理事物,它不会将数据存储在 RAM 中,但我认为它仍然如此。前几百次迭代运行良好,但在处理 8GB 数据后的某个时候,它就崩溃了。chunksize= 100000c = 0for 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_namedef process2(number):    if number !=np.nan:        new_number = str(number)        new_number = '*'*len(new_number)        return new_number    else:        return number
查看完整描述

1 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

循环的一般语法for是


for target in expression:

    do all the things

Python 会将表达式计算为一个对象,只有当计算完成时,它才会将该对象分配给目标变量。这意味着任何已存在的对象在target其替换对象构建完成之前都不会被删除。


除非创建的对象很大,否则这没什么大不了的。这里就是这种情况。创建新块时,即将删除的块位于内存中,这实际上使对内存的影响加倍。解决方案是在返回更多目标之前手动删除循环中的目标。


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)

    del chunk # destroy dataframe before next loop to conserve memory.    

    if c%10==0:

        print(c)

    c+=1


查看完整回答
反对 回复 2023-12-12
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信