我有一个销售点系统,可将我的数据导出到.csv,然后将其导入KDB。当前,我要做的是将所有数据从POS导出到csv,然后创建一个表。我有大约10个月的销售数据,我的csv文件约为11mb。随着时间的流逝,我想象csv文件将非常庞大,我想知道这是否效率低下。
在我的老工作中,我们要做的是为每一天的数据创建一个表,然后会有一个_hist表,其中将合并所有日常文件。因此,如果我只想查看当天的数据,我将查看invoicedata表,如果我想一直查看,则将查询invoidata_hist表,并将查询设置为查看(dateA; dateB)中的日期。我想知道是否应该以这种方式而不是现在的方式进行设置。
我最好拥有一个包含所有数据的非常大的csv文件,还是应该每天创建一个csv文件?如果第二种方法更好,谁能给我一个构想这一切的最佳方法的想法?
谢谢!
答案 0 :(得分:1)
如果您的记录总数不超过几百万,那么分区可能就算过分了。
如果我的每天表计数在100万左右或更多,我会考虑对数据进行分区。
您还需要考虑如何访问数据,例如在last-n
分区表中检查不频繁出现的客户的date
记录可能会影响您的查询性能,因为您必须进行迭代回溯。在这种情况下,张开的表或按年划分的表可能是合适的。
已经说过,有多种方法可以将数据存储在磁盘上,请检查this link。
二进制序列化(将表存储为二进制块)
`:/db/t set ([] ti:09:30:00 09:31:00; p:101.5 33.5)
splayed table(垂直/列分区)
`:/db/t/ set ([] ti:09:30:00 09:31:00; p:101.5 33.5) // trailing "/" in the file handle
partitioned table(水平分区的展开表)
.Q.dpft[directory;partition;`p#field;tablename]
segmented tables(进行高级分区以获得更好的查询/减少地图结果)
.Q.dpft[directory;partition;`p#field;tablename]
save
function-将数据保存为二进制/ xml / csv / txt / xml格式。由于您在问题中要求提供日期分区表,因此实际上可以使用不同的方法partition your data:
long
列上自定义)您可能希望根据表计数将数据存储在每月分区中。
要将数据保存到分区,可以使用.Q.dpft函数
.Q.dpft[directory;partition;`p#field;tablename]
来自code.kx的示例:
q)trade:([]sym:10?`a`b`c;time:.z.T+10*til 10;price:50f+10?50f;size:100*1+10?10)
q).Q.dpft[`:db;2007.07.23;`sym;`trade]
`trade