【问题标题】:KDB/KX appending table to a file without reading the entire fileKDB/KX 将表附加到文件而不读取整个文件
【发布时间】:2014-09-05 21:58:03
【问题描述】:

我是 KDB 的新手(对不起,如果这个问题很愚蠢)。我正在创建下表

q)dsPricing:([id:`int$(); date:`date$()] open:`float$();close:`float$();high:`float$();low:`float$();volume:`int$())
q)dsPricing:([id:`int$(); date:`date$()] open:`float$();close:`float$();high:`float$();low:`float$();volume:`int$())
q)`dsPricing insert(123;2003.03.23;1.0;3.0;4.0;2.0;1000)
q)`dsPricing insert(123;2003.03.24;1.0;3.0;4.0;2.0;2000)
q)save `:dsPricing

假设保存后我退出。启动 q 后,我喜欢在其中添加另一个定价项目而不加载整个文件,因为文件可能很大

q)`dsPricing insert(123;2003.03.25;1.0;3.0;4.0;2.0;1500)

我一直在查看 .Q.dpft,但我无法真正弄清楚。此表/文件也不需要分区。

谢谢

【问题讨论】:

    标签: kdb


    【解决方案1】:

    您可以使用表的文件句柄 upsert 附加到磁盘上,您的示例如下所示:

    `:dsPricing upsert(123;2003.03.25;1.0;3.0;4.0;2.0;1500)
    

    您可以使用 get、load 或 \l 将表加载到您的 q 会话中

     q)get `:dsPricing
    id  date      | open close high low volume
    --------------| --------------------------
    123 2003.03.23| 1    3     4    2   1000  
    123 2003.03.24| 1    3     4    2   2000  
    123 2003.03.25| 1    3     4    2   1500  
    

    .Q.dpft 将保存一个表splayed(表中的每一列一个文件和一个包含列名的 .d 文件),其中一个符号列上带有一个分开的属性(p#)。任何符号列也将由.Q.en 枚举。

    【讨论】:

    • 我认为它也会先将表加载到内存中,然后附加一条记录,然后再次将其写入磁盘。您可以检查它,因为此操作占用的内存几乎与使用 get 或 \l 加载表的内存相同。并且操作占用的时间和空间与文件大小成正比(如果它只是附加到文件,应该几乎是恒定的)。
    • 查看`:table insert`:table upsert之间的区别...插入不需要读表。你可以有一个不同键的内存表,如果你想避免 i/o
    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多