[Q/KDB+;]:使用“.Q.fs”从csv创建八字表时为wsfull`

[Q/KDB+;]:使用“.Q.fs”从csv创建八字表时为wsfull`,kdb,q-lang,Kdb,Q Lang,我有一个9.6GBcsv文件,我想从中创建一个磁盘上的八字表 当我运行此代码时,我的32位q进程(在Win 10上,16GB RAM机器上)内存耗尽('wsfull),并在创建不完整的4.68GB八字表后崩溃(请参见屏幕截图) 使用.Q.fs和0:读取csv文件时,内存和后台磁盘上到底发生了什么?csv是逐行读取还是逐列读取 我原以为在任何给定的时间内存中都只保存了这些数据,希望.Q.fs能够抵抗'wsfull 当q进程增加数据块时,它是否真的一次一个地将整个列(splay)放入内存中 考虑到

我有一个9.6GBcsv文件,我想从中创建一个磁盘上的八字表

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


使用
.Q.fs
0:
读取csv文件时,内存和后台磁盘上到底发生了什么?csv是逐行读取还是逐列读取

我原以为在任何给定的时间内存中都只保存了这些数据,希望
.Q.fs
能够抵抗
'wsfull

当q进程增加数据块时,它是否真的一次一个地将整个列(splay)放入内存中

考虑到:(除其他外):

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

这几乎可以解释内存不足的原因。正如在
的wsfull
之后拍摄的屏幕截图所示,有几列接近1GB的限制

下面是一个运行内存分析:

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

我相信当Q读取csv时,这是一行一行的。您的q会话崩溃的原因可能是因为您在运行期间没有清除内存

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


sym文件的大小是多少?@AlexanderBalabin 336kB当
的wsfull
开始讨论您关于q映射整列的观点时,将windbg附加到进程并在CreateFileMapping处设置断点并记录其inputs@AlexanderBalabin很有意思,但对我来说这是一个相当高的水平,除非我知道一步一步的说明怎么做
.Q.fs[{ .[ tblsplayed; (); ,; .Q.en[path dir,db] flip colnames!("SFFFFID";",")0:x]}] csvpath 
.Q.fs[{ .Q.gc[]; .[ tblsplayed; (); ,; .Q.en[path dir,db] flip colnames!("SFFFFID";",")0:x]}] csvpath