【问题标题】:Q/KDB+ / CSV upload and WSFULLQ/KDB+ / CSV 上传和 WSFULL
【发布时间】:2020-06-28 18:38:33
【问题描述】:

对不起,我是 Q 新手,找不到解决方案。下面的代码将一个四列 CSV 文件附加到 KDB+ 数据库。此代码运行良好,但现在我的数据库很大,它会引发 WSFULL 错误。也许有一种更节省内存的方式来编写它。请帮忙:

// FILE_LOADER.q
\c 520 500
if [(count .z.x) < 1;
    show `$"usage: q loadcsv.q inputfile destfile
        where inputfile and destfile are absolute or relative paths to 
        the files. Inputfile has the following fields:
                DATE, TICKER, FIELD, VALUE. DATE is of type date,
                TICKER and FIELD are strings, and VALUE is converted to a float.
                Any string VALUEs will show up as nulls.";
    exit 1
   ]
f1: hsym `$.z.x[0]
f2: hsym `$.z.x[1]
columns: `DATE`TICKER`FIELD`VALUE
if [() ~ key f1; show ("Input file '",.z.x[0],"' not found");exit 1]
x: .Q.fsn[{f2 upsert flip columns!("DSSF";",")0:x};f1;4194000000]
show ("loaded ",(string x)," characters into the kdb database")
exit 0

【问题讨论】:

  • 你读过code.kx上.Q.fsn的定义了吗? code.kx.com/q/ref/dotq/#qfsn-streaming-algorithm - “.Q.fsn 几乎与 .Q.fs 相同,但需要一个额外的参数 z,即读取块的字节大小。这对于平衡负载速度和 RAM 使用特别有用”。较低的值 = 更多的时间但使用较少的 RAM,较高的值(您拥有)= 更快但更高的 RAM 使用率

标签: csv out-of-memory kdb


【解决方案1】:

首先尝试一下,我假设您的输入 csv 文件从来没有标题?如果是这样,您将需要稍微更改代码,以便 kdb 知道。

你是正确的,这是一个内存问题,所以你可以做的就是减少块大小。您现在一次读取 4194000000 个字节。尝试根据可用内存降低此值。

如果您仍然看到问题,则可能是您的垃圾收集设置。您可以在每次读取/更新插入后强制执行 gc。

.Q.fsn[{f2 upsert flip columns!("DSSF";",")0:x;**.Q.gc[]**};f1;4194000000]

【讨论】:

  • 谢谢。我似乎无法可靠地测试此解决方案是否有效,而另一个则无效。当我可以正确测试时,我会确认解决方案。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多