【问题标题】:Splitting and joining back large tables in kdb/q在 kdb/q 中拆分和连接大表
【发布时间】:2014-11-10 13:09:47
【问题描述】:

我需要将保存在磁盘中的一个非常大的分区数据库分解为多个部分,保存这些部分,对每个部分进行排序,然后将它们重新连接以生成一个排序后的数据库。松散地说,我想将合并排序应用于一个非常大的分区。这样做的方法应该是什么?我无法加载整个表格,因为它太大而无法使用。

例如, 表大小为 15 GB, 内存为 50 GB, 列(数据类型)为data(p), id(i), value_a(C), value_b(j), value_c(f),

我想按 id 对表格进行排序。但是我无法加载表格,因为它对内存来说太大了。

【问题讨论】:

  • 这里没有足够的信息来帮助您。架构、大小、可用 RAM,一个简单的例子 - 所有这些都有助于获得答案;)
  • 感谢您的回复;可用 RAM 为 50gigs。表大小为 15gigs。假设我们有 5 列,日期、id、值 a、值 b 和值 c。我想对 id 应用排序。
  • 这是日期显示还是列显示?
  • 这是一场约会

标签: kdb


【解决方案1】:

根据我对您的响应 cmet 的理解,您可以通过多种方式实现此目的。以下是一种解决方案,我假设您可以对其进行重新设计以最适合您。您说您想“按 id 拆分”-我不确定这是什么意思,但下面是一个类似的按 sym 列拆分(在您的日期显示中会出现)-根据需要切换列名等。

假设

  • 数据库目录=/data/db
  • 新的数据库目录=/data/db2——当然,如果你愿意,可以和原来的数据库目录相同,只要新表不与源表同名
  • 数据库端口 = 5001
  • 数据库主机 = localhost
  • 大桌子=table
  • table 是来自刻度数据库的日期显示,因此列是日期、符号、时间
  • 您有一些均匀分布的 sym 值,可以将数据拆分为更易于管理的段
    • sym like "A*"sym like "B*" 将您的table 平均分配为50/50 的比例。

解决方案

您必须与数据库位于同一主机上。打开一个q提示:

/ open a connection to the db
h:hopen`::5001
/ pull down 1 partition's worth of data - a day for a date splay
/ conveniently this will take the value of enumerated syms too
table1:`time`sym xcols delete date from h"select from table where date=2014.01.01, sym like \"A*\""
table2:`time`sym xcols delete date from h"select from table where date=2014.01.01, sym like \"B*\""
/ note above we should use :: instead of : if you do all of this inside a function - to make the tables global values, as required by .Q.dpft
/ Write to location. Will sort by time and partition sym automatically
.Q.dpft[`:/data/db2;2014.01.01;`sym;] each `table1`table2

为所有分区完成此操作后,您可以使用文件系统命令删除 table(即在 unix 中,rm

如果您的表是日期显示的,但没有正常刻度数据库中的符号/时间列,您仍然可以使用功能性, 来做到这一点

@[`:/data/db2/2014.01.01/table2/;,;table2]

但是,如果要枚举,您还需要枚举 sym,并在需要它的列上设置 #p

Kdb+ 教程中包含了很多内容,强烈建议您阅读:

http://code.kx.com/wiki/JB:KdbplusForMortals/contents

【讨论】:

  • 感谢 user2393012,这不是我需要的确切解决方案,但我采用了其中的元素,这对我有用。
  • 我没有运行查询,而是按列分组,取出它们的索引并提取列索引以创建新表。请理解,最初的问题是这些表太大而无法加载到服务中。由于内存分配错误,我无法运行您写下的选择查询。
  • 我想为答案投票,但我没有足够的声誉。
  • 但这会将表格保留为两个实体。我打算将它们与完整的属性集成回来。你能帮忙吗?
  • 您可以根据我的答案中的最后一个代码块附加表格,但您必须确保结果表格的列(无论您要应用属性)是正确的形式来应用属性(您可以使用 apply @# 运算符手动执行此操作)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多