- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何有效地找到 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 进程。但我宁愿有一种更干净的做事方式,也不愿诉诸这种黑客手段。
任何想法将不胜感激。
最佳答案
因为你的数据库很大,你必须从硬盘查询它,并且面临IO瓶颈。
这实际上是这里的主要问题。智能代码无法真正弥补必须查询 40GB 文件的问题 - 特别是考虑到您的查询非常简单。多处理也无济于事(这不是 CPU 瓶颈)。所以我认为解决方案需要更新您的工作流程。
所有解决方案都依赖于异步操作(首先处理所有数据,将其转储到单独的文件,根据需要从该文件读取),或重新组织存储数据的方式。
如果您更新主 HDF5 文件的频率低于每天,您可以简单地:
更新主 HDF5 后,查询所有 securityID 的最新时间戳(使用您现有的代码)。将结果转储到单独的 H5 文件中(仅索引:SecurityID,值:最新时间戳)。当然,这个解决方案只有在每个查询花费的时间少于 30 秒的情况下才有效(这已经需要将近半天的时间了......)
然后,您可以将此数据保存在内存中(应该只有几 Kb),并在需要了解特定 SecurityID 的最新时间戳时随时访问它。
更聪明的方法(但需要更多工作)是在收到更新数据时读取最后的时间戳。我不确切知道您如何更新 HDF5 文件,但我猜您正在下载新数据并将其附加到当前文件中。
在这种情况下,这将是获取最新时间戳数据的正确时机。您的工作流程将变成:
如果上述解决方案似乎都不可行,那么您可以将每个 SecurityID 作为单独的节点存储在 h5 文件中。所以你会做类似的事情:
store.select(asset, where = Tag = ['" + tag + "'] & columns ['Datetime']")).tail(1)
调整其余代码可能需要做更多的工作(以及重新组织数据库的前期工作),但这应该会非常显着地减少您的查询时间,并且从长远来看会很有帮助。我认为没有任何充分的理由将所有 SecurityID 集中在一个巨大的节点中。而且它比其他解决方案更简单:-)
关于python - 查找 HDF5 表中列中每个唯一值的最后时间戳的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28034273/
给定一个带有多个 date_time 戳的字符串,我想 提取第一个戳及其前面的文本 候选字符串可以有一个或多个时间戳 后续的 date_time 戳记将被 sep="-" 隔开 后续date_time
是否可以合并从相机拍摄的文本和照片?我想在照片上标记日期和时间,但我在 Google 上找不到任何内容。 最佳答案 使用下面的代码来实现你所需要的。 Bitmap src = Bitm
有没有办法通过 Graph API 戳另一个用户?基于this post ,并使用 Graph Explorer ,我发布到“/USERID/pokes”,我已经授予它(Graph API 应用程序和
我有两个向左浮动的元素。一个是 body 的第一个 child ,另一个是容器的第一个 child ,容器是 body 的第二个 child 。 ...
我是一名优秀的程序员,十分优秀!