亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號