【问题标题】:Performance Tips for using Vaex使用 Vaex 的性能提示
【发布时间】:2020-06-10 18:27:02
【问题描述】:

我正在使用 Vaex 并寻找性能提示。

我的用例如下:

  • 我有一个大数据框 - 我们称之为 large_df(只有几列但有数千万行,在生产中,数据集将大于 10 倍)。其中一列称为key,这是一个64 个字符的字母数字字符串。此数据帧的内容存储在多个 HDF5 文件中。我通过 vaex.open_many(<path/to/hdf5 files/) 创建数据框。

  • 在每个请求中,代码都会收到少量(在 10 秒内)要在 large_df 中查找的键。然后我基本上必须在large_df 中查找以获取keys 与输入键列表匹配的行,然后对生成的匹配df(会小得多)进行一些处理。

根据我的阅读,Vaex 应该非常适合我的用例,但是我一直在努力获得我所期望的性能。

我的代码基本上是这样的:

import vaex
df = vaex.open_many(</path/to/hdf5 files>)
df = df[df.key.isin(<list of input keys>)].to_pandas_df()

当所有 HDF5 文件都提前缓存在磁盘上时,此代码在 i3.8xlarge 实例上大约需要 80 秒。代码在 Docker 容器内运行,CPU 上限为 30(可用的 32 个)。我阅读了有关 Vaex 如何很好地处理字符串的文章,乍一看,这似乎是 Vaex 应该能够轻松并行化并以超过 80 秒的速度计算的任务类型。

我还尝试将short_id 列预索引到包含large_df 的数据集中。基本上,这是一个整数,表示key 列中的前 4 个字符。然后,我尝试在进行完整字符串比较之前对 df 进行预过滤。此代码如下所示:

import vaex
df = vaex.open_many(</path/to/hdf5 files>)
short_ids = [alphanumeric_string_to_int(key) for key in <input keys>]
df = df[df.short_id.isin(short_ids)]  # filter df down to a smaller size
df = df[df.key.isin(<list of input keys>)].to_pandas_df()

这缩短了大约 10 秒,但这似乎应该让事情变得更快。我觉得我遗漏了一些明显的东西来说明如何快速完成这个任务。

我能做什么?请帮忙 - 谢谢!

【问题讨论】:

    标签: vaex


    【解决方案1】:

    是的,这太慢了。 Vaex 的.isin(..) 在这里并不聪明,所以我解决了你的问题https://github.com/vaexio/vaex/pull/822。我已经看到字符串的速度提高了 275 倍。合并后我会发布一个版本来解决这个问题。

    问候,

    Maarten Breddels - vaex.io

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-05
      • 2010-10-30
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多