2015-11-02 74 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%。

如果二進制不是一個選項,您可以隨時將數據拆分爲較小的文本文件。