远程存储和检索 300 个短时间序列作为 pandas 数据帧的最快方法

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

我有一个包含大约 300 个 Pandas 时间序列的数组,每个序列不超过 6 列,不超过 10,000 行。

我需要将它们存储在一个单独的持久机器中,我可以从其他机器访问它。其他机器会非常频繁地读取这些数据,我需要读取速度尽可能快

最初,我将每一行存储为 PostgreSQL 行。

然后我切换到arctic,如果我使用线程,性能提升确实令人印象深刻:

from multiprocessing.pool import ThreadPool
p = ThreadPool(300)

def read(i):
    return library.read(str(i)).data


dataframes = p.starmap(read, [0,1,2,3...])

我在这里发布了基准:https://github.com/manahl/arctic/issues/814

Arctic 基于 MongoDB,其中数据帧被腌制,然后使用唯一的密钥进行存储和检索。

有了这个,我可以在 3 秒内从 Atlas 免费层 MongoDB 实例加载数据帧。

有什么方法可以更快地做到这一点吗?

像 Feather 和 Parquet 这样的解决方案只能存储在文件系统上吗?如果是,如何在不影响读取性能的情况下远程共享该文件系统?如果我将腌制的数据帧存储在 Postgres 中,这会是一个坏主意吗?

我研究了很多不同的解决方案,但它们都关注单个数据帧的大小,而不是单独数据帧的数量。我的数据框相对较小,但数量很多,我需要多次读取所有数据框。

python pandas parquet feather arctic
1个回答
0
投票

如果您仍然有兴趣对这个问题进行基准测试,那么值得尝试ArcticDB。这是 Arctic 的改进版本,其中包括附加功能和更快的 C++ 数据处理引擎。 Python API 与 Arctic 非常相似。

特别是,对于这个问题,有一个方法

lib.read_batch
,它充分利用了C++并发性,并将工作线程的数量调整为机器上可用核心的数量。

不幸的是,Mongo 尚未得到 ArcticDB 的正式支持,但开发正在进行中。您还可以尝试许多其他后端,例如内存中、LMDB、S3 和 Azure。

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