1

我正在尝试使用交易数据找出要填充的给定数量的价格变动的平均值、中间值和百分位数范围。附上下面的代码。问题是当我在约 80k 记录上运行代码时,代码给了我 wsfull 错误。我正在使用 4g linux 机器。目前我只能运行大约 30k 条记录,即使这样 q 也使用了我 70% 以上的内存。有什么办法让它对内存更友好吗?

rangeForVol : {[symIn; vol; dt] 
data: select from table where sym=symIn, date=dt;    
data: update cumVol: sums quantity, cVol: sums quantity from data;
data: update cumVolTgt: cumVol + vol from data;
data: update pxLst: price[where each ((cumVol>=/:cVol) and (cumVol<=/:cumVolTgt))=1] from data;
.Q.gc[];
data: update minPx: min each pxLst, maxPx: max each pxLst from data;
data: update range: maxPx - minPx from data;
data
};
select count i by floor range%0.5 from rangeForVol[`ABC; 2500; 2012.06.04]
4

1 回答 1

0

您在上面引用的代码几乎肯定不会达到您想要达到的效果。

cumVol 和 cVol 列都是相同的(因为它们包含当天交易量的累计)。稍后你计算cumVol>=/:cVol/:意味着对于 cVol 中的每个元素,您会将其与整个向量 cumVol 进行比较。由于它们是相同的,您将获得单位矩阵(加上一些额外的 1b 用于任何非不同值)。

q)(til 4)=\:til 4
1000b
0100b
0010b
0001b

似乎您想在两个向量之间执行逐元素比较(尽管将向量与自身进行比较也没有意义),如果您想明确地这样做,那么 each-both 将是正确的副词 ( =')。但是,在 q 中,=运算符将逐项隐式应用于两个相同长度的向量(或向量和标量,就像在每个左示例中发生的那样),从而使任何副词变得不必要。

当您可能想要一个长度为 n 的向量时,您正在创建两个 nxn 矩阵这一事实可能是您内存不足的原因。

于 2014-04-19T15:09:47.847 回答