[Q / KDB +]:使用`.Q.fs`从csv创建splayed表时wsfull

时间:2016-07-15 16:54:10

标签: kdb q-lang

我有一个 9.6GB csv文件,我想从中创建一个磁盘上的splayed表。

当我运行此代码时,我的32位q进程(在Win 10,16GB RAM计算机上)内存不足('wsfull)并在创建不完整的4.68GB展开表后崩溃(请参见屏幕截图)

path:{` sv (hsym x 0), 1_x}
symh: {`$1_ string x}

colnames: `ric`open`high`low`close`volume`date
dir: `:F:

db: `db
tbl: `ohlcv
tbldisk: path dir,db,tbl
tblsplayed: path dir,db,tbl,`
dbsympath: symh path dir,db
csvpath: `:F:/prices.csv

.Q.fs[{ .[ tblsplayed; (); ,; .Q.en[path dir,db] flip colnames!("SFFFFID";",")0:x]}] csvpath 

使用.Q.fs0:阅读csv文件时,内存和幕后磁盘究竟发生了什么? csv是逐行还是逐列读取的?

我认为在任何给定时间内只有132kB chunks被保留在内存中,希望.Q.fs具有'wsfull抗性。

q进程是否实际上将整个列(splay)一次一个地带入内存,因为它会增加块的数量?

考虑到:(根据此source等):

  

在32位系统上,数据库的主内存OLTP部分是   限制为大约1GB的原始数据,即地址空间的1/4

几乎可以解释内存不足的问题。正如在'wsfull之后截取的截图所示,几列的接近1GB限制。

enter image description here

这是一个带内存分析的运行:

.Q.fs[{ 0N!.Q.w[]; .[ tblsplayed; (); ,; .Q.en[path dir,db] flip colnames!("SFFFFID";",")0:x]}] csvpath

enter image description here

1 个答案:

答案 0 :(得分:0)

我相信当Q读取csv时,它是逐行的。 q会话崩溃的原因可能是因为您没有在

期间清除内存
.Q.fs[{ .[ tblsplayed; (); ,; .Q.en[path dir,db] flip colnames!("SFFFFID";",")0:x]}] csvpath 

尝试添加.Q.gc[]

.Q.fs[{ .Q.gc[]; .[ tblsplayed; (); ,; .Q.en[path dir,db] flip colnames!("SFFFFID";",")0:x]}] csvpath