Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过在kdb中的分区表中追加消息来重播tplog文件_Kdb - Fatal编程技术网

通过在kdb中的分区表中追加消息来重播tplog文件

通过在kdb中的分区表中追加消息来重播tplog文件,kdb,Kdb,我试图通过追加消息将消息从tp日志直接重放到磁盘上的分区表,因为与tplog大小相比,我没有太多的主内存 TpLog如下所示: q)9 2 sublist get `:/Users/uts/Desktop/repos/ktick/tick/sym2020.05.23 `upd `trade (,0D22:38:00.083960000;,`MSFT.O;,45.15104;,710) `upd `quote (,0D22:38:01.082882000;,`VOD.L

我试图通过追加消息将消息从tp日志直接重放到磁盘上的分区表,因为与tplog大小相比,我没有太多的主内存

TpLog如下所示:

q)9 2 sublist get `:/Users/uts/Desktop/repos/ktick/tick/sym2020.05.23
`upd `trade (,0D22:38:00.083960000;,`MSFT.O;,45.15104;,710)              
`upd `quote (,0D22:38:01.082882000;,`VOD.L;,341.2765;,341.3056;,732;,481)
我正在使用下面的“upsert”方法将这些tplog MSG追加到分区表,但由于upsert上的类型错误而失败:

quote:([]time:`timespan$();sym:`symbol$();bid:`float$();ask:`float$();bsize:`int$();asize:`int$());
trade:([]time:`timespan$();sym:`symbol$();price:`float$();size:`int$());


`:/Users/uts/db/2020.05.23/quote/ set .Q.en[`:/Users/uts/db;]quote;
`:/Users/uts/db/2020.05.23/trade/ set .Q.en[`:/Users/uts/db;]trade;


upd:{[t;d]
    if[`trade~t;[show raze d;`:/Users/uts/db/2020.05.23/trade/ upsert .Q.en[`:/Users/uts/db;]enlist (cols trade)!raze d]];
    };

-11!`:/Users/uts/Desktop/repos/ktick/tick/sym2020.05.23
错误:

    'type
  [1]  upd:{[t;d]
    if[`trade~t;[show raze d;`:/Users/utsav/db/2020.05.23/trade/ upsert .Q.en[`:/Users/utsav/db;]enlist (cols trade)!raze d]];
                                                                 ^
    }
但是,如果我尝试手动将消息附加到分区表中,它工作正常:

`:/Users/uts/db/2020.05.23/trade/ upsert .Q.en[`:/Users/uts/db;]enlist (cols trade)!raze (enlist 0D22:39:00.083960000;enlist `MSFT.O;enlist 45.15104; enlist 710)
不确定为什么“upsert”不能与-11!一起在upd函数中工作


请分享(详细信息/链接),如果有更好的方法(很可能是必须的),可以在不使用太多主内存的情况下将tplogs直接重放到磁盘上。

我不确定这是否能解决您的确切问题,但有几点建议:

  • 您的代码假定每个tickerplant日志记录都针对一行。情况可能并非如此,因为许多tickerplant日志将在一次更新中记录多行。这意味着你的
    登记(cols交易)!raze d
    代码不起作用(尽管我怀疑在这种情况下有长度错误)。更通用的替代方法是使用:
  • 您不应该尝试从tickerplant日志中写入每一条upd记录到磁盘-在如此短的时间内写入的磁盘太多了。它效率低下,可能会导致磁盘I/O限制。最好在内存中插入,直到表达到一定大小,然后成批写入并擦除表。我想提出如下建议:
  • write:{`:/Users/uts/db/2020.05.23/trade/upsert.Q.en[`:/Users/uts/db;值x];从x中删除};
    upd:{[t;d]
    if[`trade~t;t插入d];
    
    如果[10000我不确定它是否能解决您的确切问题,但有几点建议:

  • 您的代码假定每个tickerplant日志记录都是针对一行的。情况可能并非如此,因为许多tickerplant日志将在一次更新中记录多行。这意味着您的
    enlist(cols trade)!raze d
    代码将无法工作(尽管我怀疑在这种情况下会出现长度错误)。一个更通用的替代方法是使用:
  • 您不应该尝试从tickerplant日志中写入每个upd记录到磁盘-这只是在如此短的时间内写入了太多磁盘。这是低效的,可能会导致磁盘I/O限制。最好在内存中插入,直到表达到一定大小,然后成批写入并擦除表。我建议这样做:例如:
  • write:{`:/Users/uts/db/2020.05.23/trade/upsert.Q.en[`:/Users/uts/db;值x];从x中删除};
    upd:{[t;d]
    if[`trade~t;t插入d];
    如果[10000
    
    $[0>type first d;enlist cols[trade]!d;flip cols[trade]!d]
    
    write:{`:/Users/uts/db/2020.05.23/trade/ upsert .Q.en[`:/Users/uts/db;value x];delete from x};
    upd:{[t;d]
        if[`trade~t;t insert d];
        if[10000<count value t;write[t]];
        };
    
    -11!`:/Users/uts/Desktop/repos/ktick/tick/sym2020.05.23;
    if[0<count trade;write[`trade]]; /need to write the leftovers
    `sym`time xasc `:/Users/uts/db/2020.05.23/trade/;
    @[`:/Users/uts/db/2020.05.23/trade/;`sym;`p#];