使用 Vaex 的性能提示
Performance Tips for using Vaex
我正在使用 Vaex 并寻找性能提示。
我的用例如下:
我有一个很大的数据框 - 让我们称之为 large_df
(只有几列,但有几千万行,在生产中,数据集将大于 10 倍)。其中一列称为 key
,这是一个 64 个字符的字母数字字符串。此数据帧的内容存储在多个 HDF5 文件中。我通过 vaex.open_many(<path/to/hdf5 files/)
.
创建数据框
在每个请求中,代码都会收到少量(在 10 秒内)要在 large_df
中查找的键。然后我基本上必须在 large_df
中查找以获取其 key
匹配输入键列表的行,然后对结果匹配的 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 的 .isin(..)
在这里不聪明所以我解决了你的问题 https://github.com/vaexio/vaex/pull/822。我已经看到字符串加速了 275 倍。合并后我会发布一个版本来解决这个问题。
此致,
Maarten Breddels - vaex.io
我正在使用 Vaex 并寻找性能提示。
我的用例如下:
我有一个很大的数据框 - 让我们称之为
large_df
(只有几列,但有几千万行,在生产中,数据集将大于 10 倍)。其中一列称为key
,这是一个 64 个字符的字母数字字符串。此数据帧的内容存储在多个 HDF5 文件中。我通过vaex.open_many(<path/to/hdf5 files/)
. 创建数据框
在每个请求中,代码都会收到少量(在 10 秒内)要在
large_df
中查找的键。然后我基本上必须在large_df
中查找以获取其key
匹配输入键列表的行,然后对结果匹配的 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 的 .isin(..)
在这里不聪明所以我解决了你的问题 https://github.com/vaexio/vaex/pull/822。我已经看到字符串加速了 275 倍。合并后我会发布一个版本来解决这个问题。
此致,
Maarten Breddels - vaex.io