gpt4 book ai didi

kdb q - 有效地计算平面文件中的表

转载 作者:行者123 更新时间:2023-12-04 19:39:54 24 4
gpt4 key购买 nike

我有很多表存储在平面文件中(在一个名为 basepath 的目录中),我想检查它们的行数。我现在能做到的最好的就是:

c:([] filename:system "ls ",basepath; 
tablesize:count each get each hsym `$basepath,/:system "ls ",basepath)

将每个表完全加载到内存中,然后执行计数(这很慢)。保存为张开的表格是加快速度的唯一方法(因为我只会加载 1 列并计算它)还是 q 中有一个我可以使用的技巧?

感谢您的帮助

最佳答案

如果您将基本路径定义为存储所有平面表的目录的路径字符串,那么您可以创建一个行数字典,如下所示:

q)cnt:{count get hsym x}
q)filename:key hsym `$basepath
q)filename!cnt each filename
t| 2
g| 3

这是我在基本路径目录中保存平面表 t 和 g 的地方。这使您不必使用通常效率较低的 system 命令。cnt 函数获取每个平面表的路径(作为符号)并返回行数而不将它们保存到内存中。

如果您可以控制保存此类文件的过程,最好的解决方案是添加一个额外的步骤,即在保存原始数据的同时将行计数的元信息单独保存在某个地方。这将允许您快速访问此文件中的表大小,而不是每次都读取完整的 tbale。

但是,请注意,要完全避免将它们拉入内存,您必须改为使用 read1 并查看二进制数据的 header 。正如你所说,最好保存为张开的表格并在一列中阅读。

更新:我不建议这样做,但强烈建议这样做,但在研究使用 read1 后出于好奇,下面是一个 hacky 解决方案可能是什么样子的示例:

f:{
b:read1(y;0;x);
if[not 0x62630b~b[2 4 5];'`$"not a table"];
cc:first first((),"i";(),4)1:b 7+til 4;
if[null ce:first where cc=sums 0x0=11 _ b;:.z.s[x*2;y]];
c:`$"\000" vs "c"$b[11+til ce];
n:first first((),"i";(),4)1:b[(20+ce)+til 4];
:`columns`rows!(c;n);
}[2000]

q 二进制文件格式在任何地方都没有记录,唯一的解决方法是保存不同的内容并查看字节如何变化。它也会因版本而异 - 以上是为 3.5 编写的,可能仅对 3.0-3.5 有效,而不是最新的 3.6 版本或任何 2.X 版本。

给定的代码按以下方式工作:

  1. 从文件前面读取一个 block

  2. 验证它看起来像一个扁平的无键表(使用符号 [11] 键翻转 dict[99] 的 [98])

  3. 将列列表中的符号计数读取为 little endian 4 byte int
  4. 在以空结尾的字符串中扫描那么多零字节
  5. 如果列太多或太冗长以至于我们没有它们所有在这个 block 中,它将使 block 的大小加倍并重试
  6. 把字符串变成符号
  7. 使用我们从列列表末尾得到的偏移量,略过列的混合列表的更多标题
  8. 然后从第一列的标题读取计数

希望这能回答你的问题!

关于kdb q - 有效地计算平面文件中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52660318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com