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

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

即使有塊,Dask也會耗盡內存

即使有塊,Dask也會耗盡內存

繁星coding 2022-07-05 19:47:35
我正在處理大型 CSV 文件,我需要制作笛卡爾積(合并操作)。由于內存錯誤,我試圖解決 Pandas 的問題(您可以在此處查看 Pandas 的代碼和相同問題的數據格式示例)但沒有成功?,F在,我正在嘗試使用 Dask,它應該可以管理大量數據集,即使它的大小大于可用 RAM。首先,我閱讀了兩個 CSV:from dask import dataframe as ddBLOCKSIZE = 64000000  # = 64 Mb chunksdf1_file_path = './mRNA_TCGA_breast.csv'df2_file_path = './miRNA_TCGA_breast.csv'# Gets Dataframesdf1 = dd.read_csv(    df1_file_path,    delimiter='\t',    blocksize=BLOCKSIZE)first_column = df1.columns.values[0]df1.set_index(first_column)df2 = dd.read_csv(    df2_file_path,    delimiter='\t',    blocksize=BLOCKSIZE)first_column = df2.columns.values[0]df2.set_index(first_column)# Filter common columnscommon_columns = df1.columns.intersection(df2.columns)df1 = df1[common_columns]df2 = df2[common_columns]然后,我將操作存儲在磁盤上以防止內存錯誤:# Computes a Cartesian productdf1['_tmpkey'] = 1df2['_tmpkey'] = 1# Neither of these two options work# df1.merge(df2, on='_tmpkey').drop('_tmpkey', axis=1).to_hdf('/tmp/merge.*.hdf', key='/merge_data')# df1.merge(df2, on='_tmpkey').drop('_tmpkey', axis=1).to_parquet('/tmp/')我創建了一個 repo 來嘗試使用與我使用的完全相同的 CSV 文件。我嘗試過使用較小blocksize的值,但我得到了同樣的錯誤。我錯過了什么嗎?任何形式的幫助將非常感激。
查看完整描述

1 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

我使用以下方法成功運行了您的代碼,內存限制為 32GB。


我已經擺脫了這個論點BLOCKSIZE,repartition而是在 df1 和 df2 上使用。


df1 = df1.repartition(npartitions=50)

df2 = df2.repartition(npartitions=1)

請注意,與 df1 相比,df2 的大小確實更?。?2.5 MB vs 23.75 MB),這就是為什么我只為 df2 保留一個分區并將 df1 分成 50 個分區的原因。


這樣做應該使代碼為您工作。對我來說,使用的內存保持在 12GB 以下。


為了檢查,我計算了結果的 len :


len(df) # 3001995

按照上述內容創建一個包含 50 個分區的 parquet 文件。您可以repartition再次使用來獲得所需的 partition_size。


注意:


添加這個應該可以加快你的代碼:


from dask.distributed import Client

client = Client()

Client(processes=False)就我而言,由于我的運行環境,我不得不使用該參數。


查看完整回答
反對 回復 2022-07-05
  • 1 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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