[英]Trying to filter in dask.read_parquet tries to compare NoneType and str
[英]dask.read_parquet causes OOM Error
我一直在使用dask對多個csv文件執行數據清理。 這段代碼可以正常工作:
import pandas as pd
import glob
import os
from timeit import default_timer
from dask.distributed import Client
import dask.dataframe as dd
cols_to_keep = ["barcode", "salesdate", "storecode", "quantity", "salesvalue", "promotion", "key_row"]
col_types = {'barcode': object,
'salesdate': object,
'storecode': object,
'quantity': float,
'salesvalue': float,
'promotion': object,
'key_row': object}
trans = dd.read_csv(os.path.join(TRANS_PATH, "*.TXT"),
sep=";", usecols=cols_to_keep, dtype=col_types, parse_dates=['salesdate'])
trans = trans[trans['barcode'].isin(barcodes)]
trans_df = trans.compute()
我決定嘗試實木復合地板存儲系統,因為它據說速度更快,並且受到了dask的支持。 使用pandas的to_parquet()
方法將csv文件轉換為.parquet之后,我嘗試了以下操作:
cols_to_keep = ["barcode", "salesdate", "storecode", "quantity", "salesvalue", "promotion", "key_row"]
trans = dd.read_parquet(os.path.join(PARQUET_PATH, '*.parquet'), columns=cols_to_keep)
trans = trans[trans['barcode'].isin(barcodes)]
trans_df = trans.compute()
圖形開始執行后不久,工作進程內存不足,並且收到多個警告:
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Worker process 13620 was killed by signal 15
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Restarting worker
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Worker exceeded 95% memory budget. Restarting
distributed.nanny - WARNING - Worker process 13396 was killed by signal 15
最后,整個程序崩潰了。 我的.parquet文件不是問題,我可以使用pandas的read_parquet()
方法加載它們。 從dask實用程序中,我注意到由於某種原因,該圖嘗試在使用.isin
調用執行任何過濾之前讀取所有內容:
使用dd.read_csv()
時不是這種情況。 在這里,所有事物都是“並行”運行的,因此過濾可以防止OOM:
有人知道發生了什么嗎? 我想念什么?
您的問題是使用pandas.to_parquet()
寫入數據。 這將在數據中創建單個龐大的行組,當Dask讀取數據時,該行組將成為一個分區-Dask會遵循數據中的任何分區。 相反,Dask會自動對CSV輸入進行分區,而不是假設數據具有固有分區。
由於您已經在使用Dask,因此您也應該使用它來編寫鑲木地板數據,並使用dask.DataFrame.to_parquet(與Pandas方法類似)。 它將在一個目錄中產生多個文件,這些文件將獨立並並行讀取。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.