以kdb / q分割和连接大表

时间:2014-11-10 13:09:47

标签: kdb

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

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

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

1 个答案:

答案 0 :(得分:0)

根据我对您的回复评论的理解,您可以通过多种方式实现这一目标。下面是一个解决方案,我假设您可以将其改造为最适合您。你说你想“按ID分割” - 我不确定这意味着什么,但下面是sym列的类似拆分(在你的日期显示中会出现) - 根据需要切换列名等。

<强>假设

  • 数据库目录= /data/db
  • 新数据库目录= /data/db2 - 当然,如果你想要的话,它可以是与原始目录相同的数据库目录,只要新表没有被调用与源名称相同的名称。表
  • 数据库端口= 5001
  • 数据库主机= localhost
  • 大表= table
  • table是一个来自tick数据库的日期,所以列是日期,sym,时间
  • 您有一些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

如果您的表显示日期但没有按照正常的tick数据库的sym / time列,您仍然可以使用功能,

来执行此操作
@[`:/data/db2/2014.01.01/table2/;,;table2]

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

很多内容都在Kdb +教程中介绍,强烈建议您阅读:

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