2015-11-02 70 views
1

我有一个变量sndpwr其中有18000行,只有一列。当我使用fprintf时,需要350MB的txt文件才能写入。即使是csvwritedlmwrite也需要200多MB的空间。MATLAB需要巨大的350 MB内存写一个列向量到TXT文件

任何人都可以告诉我任何函数或方法,将它写入一个小文本文件。我正在将其导入另一个无法导入此类大文件的程序中。

fid = fopen('sndpwr.txt','wt'); 
fprintf(fid,'%0.6f\r\n',sndpwr'); 
fclose(fid); 

谢谢!

EDIt:在工作区中它被描述为31957476x1 double。对不起,我以前的错误数据。

+2

'fid = fopen('sndpwr.txt','wt');'这是用单引号编译的? C++何时成为JavaScript? – PaulMcKenzie

+3

我的第一个动作是仔细检查你的变量'sndpwr'的确是大小'[18000 x 1]'。 @PaulMcKenzie,'C++'标记不相关,它应该被删除。这是'Matlab'代码。 – Hoki

+1

使用'nbw = fprintf(fid,'%0.6f \ n',sndpwr);'。您不需要'\ r \ n',因为这会在每条值线之间给出一条空行。你也不需要转置(在'sndpwr'后删除''')。 'nbw'变量将包含函数fprintf写入光盘的字节数(仔细检查该值)。如果我将'sndpwr = rand(18000,1);'保存到上面的代码(根据我的建议)的文本文件中,我最终得到的文件只有176KB。我强烈怀疑你的'sndpwr'变量不是你想象的那样。 – Hoki

回答

2

不幸的是,如果不使用实际的压缩算法,就无法压缩数据。您有3x10^7数字,在小数点后面用六位数字写,至少有一个数字,还有一些换行符。这是最低限度的3x10^7 * 10 = 3x10^8字节。由于1MB大约为10^6字节,因此您将获得订单上的文件或300MB。

如果您使用double数据类型以二进制格式写入文件,由于双打格式通常是64位(8字节数字),因此文件可能会减小约20%。如果您要使用single数据类型,可能会丢失一些信息,因为single只能保存大约5位数的小数精度,但该文件只能是当前大小的40%。

如果二进制不是一个选项,您可以随时将数据拆分为较小的文本文件。