【问题标题】:Cast char list column to symbol将字符列表列转换为符号
【发布时间】:2020-03-26 11:26:24
【问题描述】:

我有一张在 hdb 中有大约 30 亿行的表。其中一列是 char 列表,我想在加载 hdb 后将此列转换为符号。但是内存很快就超过了 300GB,这是我负担不起的。这可以以任何方式优化吗?

【问题讨论】:

  • 您目前如何将其转换为符号?使用 dbmaint?
  • @terrylynch 我会更新这个问题。我正在加载 hdb,然后尝试进行投射。

标签: kdb


【解决方案1】:

您是要转换为内存中的符号(临时)还是转换为磁盘上的符号(永久)?如果在内存中,您不应该尝试将所有日期转换为符号,您可以在从中选择时转换为符号(使用日期过滤器)或构建一个包装函数来处理这个问题。您需要分析字符串的重复性,因为您转换为符号的每个字符串都会被拦截并消耗内存。如果字符串非常独特(例如很长),那么您最终可能会创建太多的内部符号,从而导致您的内存爆炸。

如果在磁盘上,您应该使用 Kx 的 dbmaint 实用程序 - 它有一个从字符列表(字符串)转换为枚举符号的特定示例。

https://github.com/KxSystems/kdb/blob/master/utils/dbmaint.md#fncol

您必须非常小心 - 再次您需要分析字符串列以确保其重复性足以保证转换为符号(向 sym 文件添加尽可能少的新符号)。如果字符串非常独特,那么您应该 转换为符号,因为您可能会冒着用大量新符号污染 sym 文件的风险。

最终最有效的方法是假设字符串是重复的(例如短),在磁盘上进行永久性更改

【讨论】:

  • 我正在内存中加载表格并过滤某个特定日期的数据。问题是即使在一天中它也有超过 30 亿行。所述列中的字符串变化非常快,所以如果我在保存时尝试使其成为符号,它会炸毁 sym 文件,这将导致加载 hdb 延迟,这将解决这个问题,但会创建其他问题。
  • 我明白了。那么为什么你希望内存中的列是类型符号呢?加快过滤速度?此列是日期过滤器之后的第一个 where 过滤器吗? (我假设表是日期分区的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 2020-02-19
  • 2013-07-04
相关资源
最近更新 更多