如何在两个不同的Python脚本和版本之间共享大型数据帧?

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

我想在不同环境中运行的多个Python脚本之间共享数据。 我的数据以 Pandas Dataframes(和 dask dataframes)的形式出现。通常,数据帧包含浮点数、整数、字符串和 pd.timestamps。它们的大小可能很大(大约 15,000,000 行 x 20 列)。

不幸的是,我的脚本环境的依赖关系不兼容。不仅 Pandas 版本不同(2.0、1.2),Python 版本也不同(3.10 和 3.8)。

这是我的程序脚本的简短摘要:

  • 脚本 A -> 获取并存储: 从互联网获取数据并使用 arcticdb 存储它。
  • 脚本 B -> 机器学习预测: 使用脚本 A 中的数据执行机器学习并且将预测存储在脚本 A 的存储中,因此我不必再次进行机器学习预测
  • C脚本->处理: 从脚本 A 的存储加载数据并从脚本 B 请求新的预测

一个简单的数据流图:

C <-┌-- B <---> A
    └---------- A

由于数据帧的大小,我想避免向磁盘写入任何内容来共享我的数据。

我读过有关流式 pickle 数据的内容,但由于 A 和 B 需要来回通信,因此这行不通,因为 pickle 仅向下(而不是向上)兼容。

有什么方法可以避免在共享之前和之后转换数据帧(例如 df -> dict -> share -> dict -> df)以减少开销?

python python-3.x pandas dask
1个回答
0
投票

从 dask 的角度来看,(分布式)集群是多租户的,因此您完全可以从一个客户端连接并创建数据集供另一个客户端使用(https://distributed.dask.org/en/stable/发布.htm)。

但是,您通常希望并需要匹配的版本。如果客户端 dask/分布式版本与调度程序和工作人员不匹配,则事情可能根本无法工作(至少会出现警告)。 如果您在客户端中使用 dask.dataframe API,这是一个问题,因为腌制将是在工作人员之间复制数据的方式。

但是,您可以在从客户端调用的工作线程上运行普通函数,甚至可以创建数据帧并“发布”它们。

def make_it():
    from distributed import get_client
    import dask.dataframe as dd
    client = get_client()
    df = ...
    df2 = client.persist(df)
    client.publish_dataset(negative_accounts=df2)

通过这种方法,第一个客户端在工作人员上使用 pandas 版本,并且除了函数代码之外不腌制任何内容,因此这很可能有效。如果第二个客户端会话确实有匹配的版本,它可以毫无问题地 client.get_dataset 。

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