2013-10-31 55 views
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] 

回答

0

你上面引用的代碼幾乎肯定不會做你正在努力實現的。

列cumVol和cVol都是相同的(因爲它們包含當天的總量)。之後你計算cumVol>=/:cVol/:表示對於cVol中的每個元素,您都會將其與整個矢量cumVol的整個進行比較。因爲它們是相同的,你將得到單位矩陣(對於任何非不同的值加上一些額外的1b)。

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

看來你要執行兩個向量之間的元素比較中的(雖然矢量也與自己進行比較是沒有意義的),如果你想明確地做到這一點,每一個,都將成爲正確的副詞(=')。然而,在q中,=運算符將隱含地將項目明智地應用於兩個相同長度的向量(或者一個向量和一個標量,就像在每個左邊的示例中發生的那樣),從而使任何副詞都不必要。

當你想要長度爲n的矢量時,你正在創建兩個n×n矩陣的事實可能是你內存不足的原因。