我有一个 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.fs
和0:
阅读csv文件时,内存和幕后磁盘究竟发生了什么? csv是逐行还是逐列读取的?
我认为在任何给定时间内只有132kB chunks被保留在内存中,希望.Q.fs
具有'wsfull
抗性。
q进程是否实际上将整个列(splay)一次一个地带入内存,因为它会增加块的数量?
考虑到:(根据此source等):
在32位系统上,数据库的主内存OLTP部分是 限制为大约1GB的原始数据,即地址空间的1/4
几乎可以解释内存不足的问题。正如在'wsfull
之后截取的截图所示,几列的接近1GB限制。
这是一个带内存分析的运行:
.Q.fs[{ 0N!.Q.w[]; .[ tblsplayed; (); ,; .Q.en[path dir,db] flip colnames!("SFFFFID";",")0:x]}] csvpath
答案 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