使用带有多处理功能的 pandas“read_csv”读取数千个 csv 文件时出现内存问题

问题描述 投票:0回答:1

我正在尝试将数千个文件连接成一个大数据帧,该数据帧将进一步馈送到 XGBoost 库进行训练。我正在 Sagemaker 训练实例上运行训练过程。训练过程在小数据集上运行没有任何错误。我在 ml.m5.4xlarge 实例(16vCPU 和 64GB 内存)上运行了包含 4M 行(6GB 数据)的一天数据集的训练,训练花费了大约 11 个小时并成功运行。然而,当我使用一周大约 41GB 的数据进行训练时,我在运行以下代码时遇到内存问题:

def _read_training_data(training_data_path: str) -> pd.DataFrame:
    df = pd.read_csv(training_data_path)
    return df


def read_training_data(
    paths: List[str]
) -> pd.DataFrame:

    # lazy loading of modules for training
    import multiprocessing as mp
    from concurrent.futures import ProcessPoolExecutor, as_completed

    # get directories
    ipaths = train_mdirnames(paths)

    logger.info(f'start parallel data reading with {mp.cpu_count()} core')

    df = None
    with ProcessPoolExecutor(max_workers=mp.cpu_count()) as executor:
        tasks = [
            executor.submit(_read_training_data, ipath)
            for ipath in ipaths]

        for future in as_completed(tasks):
            try:
                _df = future.result()
                df = _df if df is None else pd.concat([df, _df])
            except Exception as e:
                raise e

    logger.info(f'have read {len(df)} data points')

在这种情况下读取海量数据的最佳方式是什么?

我们还计划用一个月的数据来训练数据,这将是巨大的。我们计划使用较小的实例或类似的实例读取此类数据,以避免高昂的成本,然后将巨大的串联数据帧提供给 XGBoost 库进行训练。

python pandas multiprocessing amazon-sagemaker xgboost
1个回答
0
投票

解决方案由

XGBoost
给出。您应该使用
DMatrix
并使用 外部内存版本:

来自文档:

处理大型数据集时,训练 XGBoost 模型可能具有挑战性,因为需要将整个数据集加载到内存中。这可能成本高昂,有时甚至不可行。从 1.5 开始,用户可以定义自定义迭代器来加载数据块以运行 XGBoost 算法。外部存储器可用于训练和预测,但训练是主要用例,这将是我们在本教程中的重点。对于预测和评估,用户可以自己迭代数据,而训练则需要将完整数据集加载到内存中。

© www.soinside.com 2019 - 2024. All rights reserved.