【问题标题】:Read from memory for full pipeline, read from files if retry or partial pipeline从内存中读取完整管道,如果重试或部分管道,则从文件中读取
【发布时间】:2020-08-18 08:02:22
【问题描述】:

如何使用管道从内存/文件运行?我认为这些功能已经存在,但我不确定如何编写这样的管道。

我的用例是:

  1. 正常流水线,从第 1 步到第 10 步
  2. 从第 2 步运行到第 10 步

想象一下,在第 1 步,我会将一个数据帧写入 csv,而第 2 步将需要从中读取数据。如果我从第 1 步开始运行,我想将该数据帧传递到内存中(以节省读取时间)。但如果我从第 2 步开始运行,则需要从 csv 读取数据。

使用 Kedro 的最佳做法是什么?

https://kedro.readthedocs.io/en/stable/06_nodes_and_pipelines/02_pipelines.html#pipeline-with-circular-dependencies

【问题讨论】:

    标签: kedro


    【解决方案1】:

    我可以想到 2 种方法,具体取决于您的用例。

    a) 您可以为此使用单独的环境。运行完整管道时,您使用一些环境 regular,其中没有相关数据集的目录条目(因此将转换为 MemoryDataSet),而在单独的 dev 环境中,您有一个条目您的 catalog.yml 将其保存为 CSV。但这确实意味着您必须从节点 1 运行 dev 才能生成用于后续运行的 csv。

    kedro run --env regular
    kedro run --env dev
    kedro run -e dev --from-nodes node2
    

    相关文档:https://kedro.readthedocs.io/en/stable/04_kedro_project_setup/02_configuration.html#additional-configuration-environments

    b) 另一种方法是,如果您总是希望第一个节点写入 csv,则让 node1 返回 2 个输出(相同数据),一个为 pandas.CSVDataSet,一个为 MemoryDataSet,然后您定义不同的管道。管道complete 第二个节点从内存读取,partial 没有 node1,而 node2 从 csv 数据集读取。

    kedro run --pipeline complete
    kedro run --pipeline partial
    

    https://kedro.readthedocs.io/en/stable/06_nodes_and_pipelines/02_pipelines.html#running-a-pipeline-by-name

    【讨论】:

      【解决方案2】:

      除了@Lorena Balan 建议的选项外,您还可以使用CachedDataSet。您的目录条目将与此类似:

      my_cached_dataset:
        type: CachedDataSet
        dataset:
          type: pandas.CSVDataSet
          filepath: path/to/file
      
      

      缓存数据集将使用常规基础数据集保存数据,并且还将填充其内部缓存,然后后续加载将从该内存缓存中提取数据。如果缓存为空(您的方案 2),CachedDataSet 加载时将从底层 [CSV] 文件中提取数据。

      【讨论】:

      • cachedataset 似乎更合适,因为我事先不知道部分管道(例如,由于网络错误,我可能在第 4 步失败,需要从那里重新运行)。有什么缺点吗?因为我想将它用于每个数据集。
      • 我看到的唯一明显的缺点是管道的内存占用,因为在运行期间所有数据集都将缓存在内存中。
      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多