gpt4 book ai didi

python - 查找 HDF5 表中列中每个唯一值的最后时间戳的有效方法

转载 作者:行者123 更新时间:2023-12-01 04:53:07 25 4
gpt4 key购买 nike

如何有效地找到 SecurityID 列中每个唯一值的最后时间戳(从日期时间列)? SecurityID 列中大约有 1000 个唯一值。

目前,我在整个表中查询 SecurityID 中的每个唯一值,然后查找最后一个时间戳。正如你可能想象的那样,它的速度慢得令人难以忍受。该表超过 40GB 并且还在不断增长。

我做了这样的事情:

os.chdir('E:\HDFStores')
store = pd.HDFStore('mysuperawesomehdfstore.h5')
assets = skBase.bbg_helper_assets('minutely')
df_timestamp = pd.Dataframe()
tags = ['T', 'B', 'A']
for asset in assets:
for tag in tags:
print asset, " ", tag
timestamp = (store.select('table', where = "SecurityID = ['" + asset + "'] & Tag = ['" + tag + "'] & columns = ['Datetime']")).tail(1)
if len(timestamp_.index) == 0:
print "value DNE"
else:
dt = (str(timestamp_iloc[0][0])).split(' ', 1)[0]
tm = (str(timestamp_iloc[0][0])).split(' ', 1)[1]

我考虑过在我的 4 核机器上运行单独的 python 进程。但我宁愿有一种更干净的做事方式,也不愿诉诸这种黑客手段。

任何想法将不胜感激。

enter image description here

最佳答案

因为你的数据库很大,你必须从硬盘查询它,并且面临IO瓶颈。

这实际上是这里的主要问题。智能代码无法真正弥补必须查询 40GB 文件的问题 - 特别是考虑到您的查询非常简单。多处理也无济于事(这不是 CPU 瓶颈)。所以我认为解决方案需要更新您的工作流程。

所有解决方案都依赖于异步操作(首先处理所有数据,将其转储到单独的文件,根据需要从该文件读取),或重新组织存储数据的方式。

异步1

如果您更新主 HDF5 文件的频率低于每天,您可以简单地:

更新主 HDF5 后,查询所有 securityID 的最新时间戳(使用您现有的代码)。将结果转储到单独的 H5 文件中(仅索引:SecurityID,值:最新时间戳)。当然,这个解决方案只有在每个查询花费的时间少于 30 秒的情况下才有效(这已经需要将近半天的时间了......)

然后,您可以将此数据保存在内存中(应该只有几 Kb),并在需要了解特定 SecurityID 的最新时间戳时随时访问它。

异步2

更聪明的方法(但需要更多工作)是在收到更新数据时读取最后的时间戳。我不确切知道您如何更新 HDF5 文件,但我猜您正在下载新数据并将其附加到当前文件中。

在这种情况下,这将是获取最新时间戳数据的正确时机。您的工作流程将变成:

  1. 下载新数据
  2. 从新数据中,对于每个 SecurityID,获取最新的时间戳
  3. 转储/更新您的“latest_timestamp”h5 文件
  4. 使用新数据更新您的主 HDF5

H5重组

如果上述解决方案似乎都不可行,那么您可以将每个 SecurityID 作为单独的节点存储在 h5 文件中。所以你会做类似的事情:

store.select(asset, where = Tag = ['" + tag + "'] & columns ['Datetime']")).tail(1)

调整其余代码可能需要做更多的工作(以及重新组织数据库的前期工作),但这应该会非常显着地减少您的查询时间,并且从长远来看会很有帮助。我认为没有任何充分的理由将所有 SecurityID 集中在一个巨大的节点中。而且它比其他解决方案更简单:-)

关于python - 查找 HDF5 表中列中每个唯一值的最后时间戳的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28034273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com