我在一个名为“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))
如何克服此错误?我尝试了各种方法,我确信这很简单,但无法找到解决方法。
答案 0 :(得分:4)
set将以二进制格式保存表,而不是csv。使用0:(内部由save
使用)以csv格式保存具有不同文件名的表:
q)hsym[`$string[sd],".csv"] 0: csv 0: data
`:2017.12.08.csv
答案 1 :(得分:0)
您应该能够通过批量写入文件而不是批量来绕过限制。以下是允许您这样做的功能。该函数有3个参数:批量大小n
,文件名f
和data
要写入文件。它打开文件的句柄,检查文件是否为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
};
此函数非常简化,因为它不会检查架构,因此在将混合架构传递给它时可能会出现问题。