【问题标题】:How to save large file with different file name (KDB)?如何保存具有不同文件名(KDB)的大文件?
【发布时间】:2018-02-23 22:18:43
【问题描述】:

我在一个名为“data”的变量中有一个有点大的表(保存时大约 3GB)。

我可以将它保存到一个文件中:

save `:data.csv

但是,如果我尝试用不同的文件名保存它,我会收到错误:

sd: 2017.12.08;

string[sd],".csv" set data

ERROR: 'limit 
(tried to generate a list with more than 2,000,000,000 elements (keep in mind that any IPC result is a byte list, hence can't be longer than 2 metric Gb))

我该如何克服这个错误?我尝试了多种方法,我确信这很简单,但无法找到解决方法。

【问题讨论】:

    标签: kdb


    【解决方案1】:

    set 将以二进制格式保存表格,而不是 csv。使用0:save 内部使用)以不同的文件名将表格保存为 csv 格式:

    q)hsym[`$string[sd],".csv"] 0: csv 0: data
    `:2017.12.08.csv
    

    【讨论】:

    • 漂亮的解决方案。谢谢你,好心的陌生人!
    • 有什么办法可以在此附加文件路径吗?尽管尝试了很多次,但无法弄清楚如何。
    • 回答我自己的评论 - 我能够做到:hsym[` sv ` :/path,`$string[ed],".csv"] 0: csv 0: data;
    • 其他方法:1)字符串连接:hsym[`$"/path/",string[sd],".csv"] 0: csv 0: data 2).Q.dd.Q.dd[`:/path;`$string[sd],".csv"] 0: csv 0: data
    【解决方案2】:

    您应该能够通过批量而不是批量写入文件来绕过限制。下面是一个允许您这样做的功能。该函数采用 3 个参数:批量大小n、文件名fdata 要写入文件。它打开文件的句柄,使用hcount 检查文件是否为空,并在必要时写入列标题。然后批量保存数据,并在完成时关闭文件句柄。

    chunk:{[n;f;data]
      h:hopen f;                                   / open file handle
      if[0=hcount f;h","sv string cols data];      / write headers to empty file
      {x raze"\n",/:1_","0:y}[h]'[n cut data];     / write chunks to file
      :hclose h;                                   / close file handle
     };
    

    此函数非常简化,因为它不检查架构,因此在将混合架构传递给它时可能会导致问题。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多