kdb/q中大型表的拆分和连接

kdb/q中大型表的拆分和连接,kdb,Kdb,我需要将保存在磁盘中的一个非常大的分区数据库分解为多个部分,保存这些部分,对每个部分进行排序,然后将它们合并回一个已排序的数据库。粗略地说,我想对一个非常大的分区应用合并排序。这样做的方法应该是什么?我无法加载整个表,因为它太大,无法使用 比如说,, 表大小为15GB, 内存是50GB, 列数据类型为datap、idi、value_aC、value_bj、value_cf、 我想按id对表进行排序。但我无法加载表,因为它太大,无法容纳内存。根据我对您的回复评论的理解,您可以通过多种方式实现这一点

我需要将保存在磁盘中的一个非常大的分区数据库分解为多个部分,保存这些部分,对每个部分进行排序,然后将它们合并回一个已排序的数据库。粗略地说,我想对一个非常大的分区应用合并排序。这样做的方法应该是什么?我无法加载整个表,因为它太大,无法使用

比如说,, 表大小为15GB, 内存是50GB, 列数据类型为datap、idi、value_aC、value_bj、value_cf、


我想按id对表进行排序。但我无法加载表,因为它太大,无法容纳内存。

根据我对您的回复评论的理解,您可以通过多种方式实现这一点。下面是一个解决方案,我假设您可以修改它以最适合您。你说你想按id拆分-我不确定这意味着什么,但下面是一个类似的按sym拆分列,它将出现在你的日期splay中-根据需要切换列名等

假设

数据库目录=/data/db newdatabasedirectory=/data/db2——当然,如果需要,它可以是与原始数据库目录相同的数据库目录,只要新表不是以与源表相同的名称调用的 数据库端口=5001 数据库主机=本地主机 大桌子 表是来自tick数据库的日期显示,所以列是date、sym和time 您有一些均匀分布的sym值,可以将数据分割成更易于管理的段 假设sym-like A*和sym-like B*将您的表平均分配为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
对所有分区执行此操作后,可以使用文件系统命令(即在unix中,rm)删除表

如果您的表是日期八字显示的,但没有正常tick数据库中的sym/time列,您仍然可以使用functional

但是,如果要枚举,还需要枚举符号,并在需要的列上设置p

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


这里没有足够的信息来帮助您。模式、大小、可用RAM,一个简单的例子——所有这些都有助于得到答案;感谢您的回复;可用内存为50G。桌子大小是15吉格。假设我们有5列,日期、id、值a、值b和值c。我想对id应用排序。这是一个日期显示还是列显示?这是一个日期显示感谢用户2393012,这不是我所需要的确切解决方案,但我使用了其中的元素,这对我来说很有效。我没有运行查询,而是按列分组,取出它们的索引并提取列索引来创建新表。请理解,最初的问题是这些表太大,无法加载到服务中。由于内存分配错误,我无法运行您写下的select查询。我想对答案进行更新投票,但我没有足够的信誉。但这会将表保留为两个实体。我打算让它们完整地集成回属性。你能帮忙吗?你可以按照我答案中的最后一个代码块追加表,但你必须确保结果表的列,无论你想应用哪个属性,都是正确的形式来应用属性。你可以使用apply@和操作符手动执行此操作
@[`:/data/db2/2014.01.01/table2/;,;table2]