我需要将保存在磁盘中的非常大的分区数据库分解为多个部分,保存部分,对每个部分进行排序,然后将它们连接起来以生成一个已排序的数据库。松散地说,我想将合并排序应用于非常大的分区。这样做的方法应该是什么?我无法加载整个表格,因为它太大而无法使用。
例如, 表大小为15 GB, 内存为50 GB, 列(数据类型)是数据(p),id(i),value_a(C),value_b(j),value_c(f),
我想按id对表进行排序。但是我无法加载表格,因为它对于内存来说太大了。
答案 0 :(得分:0)
根据我对您的回复评论的理解,您可以通过多种方式实现这一目标。下面是一个解决方案,我假设您可以将其改造为最适合您。你说你想“按ID分割” - 我不确定这意味着什么,但下面是sym列的类似拆分(在你的日期显示中会出现) - 根据需要切换列名等。
<强>假设强>
/data/db
/data/db2
- 当然,如果你想要的话,它可以是与原始目录相同的数据库目录,只要新表没有被调用与源名称相同的名称。表5001
localhost
table
table
是一个来自tick数据库的日期,所以列是日期,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 +教程中介绍,强烈建议您阅读: