簡體   English   中英

dask.read_parquet導致OOM錯誤

[英]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_parquet()執行圖

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM