如何使用不同的文件名(KDB)保存大文件?

时间:2018-02-23 22:18:44

标签: kdb

我在一个名为“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))

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

您应该能够通过批量写入文件而不是批量来绕过限制。以下是允许您这样做的功能。该函数有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
 };

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