有沒有人在這裏知道如何刪除變量從一個matlab文件?我知道您可以使用save -append
方法將變量添加到現有的matlab文件,但沒有關於如何從文件中刪除變量的文檔。因爲我正在將中間處理步驟保存到磁盤以緩解內存問題,最終每個分析例程將會有近10 GB的中間數據。謝謝!從.mat文件中刪除變量
回答
有趣的是,你可以從一個.MAT文件中使用-append
選項與SAVE到有效擦除數據。注意從文檔的摘錄(由我大膽的加入):
對於MAT文件,
-append
增加了新的變數文件或工作區的值替換現有變量保存的值。
換句話說,如果在你的.MAT文件中的變量稱爲A
,可以節省超過,使用-append
與A
一個新複印件(你已經設置爲[]
)變量選項。 .mat文件中仍然會有一個名爲A
的變量,但該變量將爲空,因此會減小總文件大小。
下面是一個例子:
>> A = rand(1000); %# Create a 1000-by-1000 matrix of random values
>> save('savetest.mat','A'); %# Save A to a file
>> whos -file savetest.mat %# Look at the .mat file contents
Name Size Bytes Class Attributes
A 1000x1000 8000000 double
的文件大小將約爲7.21 MB。現在做到這一點:
>> A = []; %# Set the variable A to empty
>> save('savetest.mat','A','-append'); %# Overwrite A in the file
>> whos -file savetest.mat %# Look at the .mat file contents
Name Size Bytes Class Attributes
A 0x0 0 double
現在文件大小將是169個字節左右。該變量仍然存在,但它是空的。
我所知道的唯一方法是使用MAT文件API函數matDeleteVariable
。我想,編寫一個Fortran或C例程來做這件事很容易,但是對於那些應該更容易的事情來說,它看起來像是一個很大的努力。
我建議你從要保存的.mat文件中加載變量,並將它們保存到一個新的.mat文件中。如有必要,您可以在循環中加載並保存(使用'-append'
)。
S = load(filename, '-mat', variablesYouWantToKeep);
save(newFilename,'-struct',S,variablesYouWantToKeep);
%# then you can delete the old file
delete(filename)
這就是我正在做的,但這是一個可行的解決方法。我真的很驚訝,似乎沒有直接的方法來做到這一點。 – eykanal 2010-11-24 16:07:27
10 GB的數據?由於MAT格式的開銷,更新多變量MAT文件可能變得昂貴。考慮將數據拆分並將每個變量保存到不同的MAT文件中,必要時使用組織目錄。即使你有一個方便的功能來從MAT文件中刪除變量,效率也會很低。 MAT文件中的變量是連續放置的,因此替換一個變量可能需要讀取和寫入其餘大部分內容。如果它們在單獨的文件中,則可以刪除整個文件,這很快。
若要查看此操作,請嘗試使用此代碼,並在調試器中逐步執行此代碼,同時使用類似Process Explorer(在Windows上)來監視其I/O活動。
function replace_vars_in_matfile
x = 1;
% Random dummy data; zeros would compress really well and throw off results
y = randi(intmax('uint8')-1, 100*(2^20), 1, 'uint8');
tic; save test.mat x y; toc;
x = 2;
tic; save -append test.mat x; toc;
y = y + 1;
tic; save -append test.mat y; toc;
在我的機器上,結果如下所示。(讀取和寫入是累積時間是每操作。)
Read (MB) Write (MB) Time (sec)
before any write: 25 0
first write: 25 105 3.7
append x: 235 315 3.6
append y: 235 420 3.8
注意,更新所述小x變量大於更新大ý更昂貴。許多I/O活動都是「冗餘」的內務管理工作,以保持MAT文件格式的組織性,並且如果每個變量都在它自己的文件中將會消失。
此外,請嘗試將這些文件保留在本地文件系統上;它比網絡驅動器要快很多。如果他們需要繼續使用網絡驅動器,請考慮在本地臨時文件(可能使用tempname()選擇)上執行save()和load(),然後將它們複製到網絡驅動器。對於本地文件系統,Matlab的保存和加載速度要快得多,足以使本地保存/加載和副本可以獲得實質性的淨勝利。
這是一個基本的實現,它可以讓您使用熟悉的save()和load()簽名將變量保存爲單獨的文件。它們的前綴爲「d」,表示它們是基於目錄的版本。他們使用一些技巧與evalin()和assignin(),所以我認爲這將是值得發佈完整的代碼。
function dsave(file, varargin)
%DSAVE Like save, but each var in its own file
%
% dsave filename var1 var2 var3...
if nargin < 1 || isempty(file); file = 'matlab'; end
[tfStruct,loc] = ismember({'-struct'}, varargin);
args = varargin;
args(loc(tfStruct)) = [];
if ~all(cellfun(@isvarname, args))
error('Invalid arguments. Usage: dsave filename <-struct> var1 var2 var3 ...');
end
if tfStruct
structVarName = args{1};
s = evalin('caller', structVarName);
else
varNames = args;
if isempty(args)
w = evalin('caller','whos');
varNames = { w.name };
end
captureExpr = ['struct(' ...
join(',', cellfun(@(x){sprintf('''%s'',{%s}',x,x)}, varNames)) ')'];
s = evalin('caller', captureExpr);
end
% Use Java checks to avoid partial path ambiguity
jFile = java.io.File(file);
if ~jFile.exists()
ok = mkdir(file);
if ~ok;
error('failed creating dsave dir %s', file);
end
elseif ~jFile.isDirectory()
error('Cannot save: destination exists but is not a dir: %s', file);
end
names = fieldnames(s);
for i = 1:numel(names)
varFile = fullfile(file, [names{i} '.mat']);
varStruct = struct(names{i}, {s.(names{i})});
save(varFile, '-struct', 'varStruct');
end
function out = join(Glue, Strings)
Strings = cellstr(Strings);
if length(Strings) == 0
out = '';
elseif length(Strings) == 1
out = Strings{1};
else
Glue = sprintf(Glue); % Support escape sequences
out = strcat(Strings(1:end-1), { Glue });
out = [ out{:} Strings{end} ];
end
以下是load()等價物。
function out = dload(file,varargin)
%DLOAD Like load, but each var in its own file
if nargin < 1 || isempty(file); file = 'matlab'; end
varNames = varargin;
if ~exist(file, 'dir')
error('Not a dsave dir: %s', file);
end
if isempty(varNames)
d = dir(file);
varNames = regexprep(setdiff(ls(file), {'.','..'}), '\.mat$', '');
end
out = struct;
for i = 1:numel(varNames)
name = varNames{i};
tmp = load(fullfile(file, [name '.mat']));
out.(name) = tmp.(name);
end
if nargout == 0
for i = 1:numel(varNames)
assignin('caller', varNames{i}, out.(varNames{i}));
end
clear out
end
Dwhos()相當於whos(' - file')。
function out = dwhos(file)
%DWHOS List variable names in a dsave dir
if nargin < 1 || isempty(file); file = 'matlab'; end
out = regexprep(setdiff(ls(file), {'.','..'}), '\.mat$', '');
和ddelete()刪除像你問的個別變量。
function ddelete(file,varargin)
%DDELETE Delete variables from a dsave dir
if nargin < 1 || isempty(file); file = 'matlab'; end
varNames = varargin;
for i = 1:numel(varNames)
delete(fullfile(file, [varNames{i} '.mat']));
end
- 1. 從OpenCV中刪除列Mat
- 2. 如何從Eclipse中刪除MAT?
- 3. 通過讀取另一個mat文件中的變量名將變量保存到mat文件中
- 4. 從MAT文件中加載索引的特定變量
- 5. Matlab以變量名保存.mat文件
- 6. sed從文件中刪除變量中的確切模式
- 7. 從變量中刪除常量
- 8. 刪除變量一段文字,從每行文本文件
- 9. 從文件列表變量中刪除所有非目錄
- 10. Bash:從匹配變量的文件中刪除一行
- 11. 從刪除字符變量
- 12. 刪除文本文件中的批處理文件變量
- 13. 用awk變量來刪除文件
- 14. 如何從mat文件加載指定的變量
- 15. 表單文件中刪除文件範圍變量
- 16. bash刪除作爲變量傳遞的文件中的文件
- 17. PHP從變量中刪除「引用」。
- 18. jquery根據變量從dom中刪除
- 19. 從公式中刪除因變量model.matrix
- 20. Qt qmake:從變量中刪除條目
- 21. 從變量中刪除http://或https://
- 22. 從變量中刪除重複值
- 23. 從變量中刪除特定項目...?
- 24. 從類函數中刪除類變量
- 25. 從PHP變量中刪除空數組
- 26. 從數組中刪除變量()
- 27. 從變量中刪除前綴
- 28. 從變量中刪除列(LINQ)
- 29. 從jQuery變量中刪除引用
- 30. 從變量中刪除前綴-bash
哇,我希望這不是唯一的辦法,但感謝指出。自從我用C語言寫出任何東西之後,我已經有一段時間了...我一直試圖寫出你剛纔提到的C例程。 – eykanal 2010-11-24 15:26:58
@eykanal:我希望它不是唯一的方法。但是沒有人告訴我們在命令窗口中執行此操作的更直接的方法。 – 2010-11-24 16:14:09
可能有意不讓這更方便。 MAT文件格式的連續佈局意味着當你刪除一個變量時,你需要將「垃圾」留在原地並浪費磁盤空間,或者可能重寫大部分文件。有點像數組中某個元素的O(n)刪除開銷,但會花費磁盤I/O。公開一個deletevariable函數可能會導致不熟練的用戶意外地執行大量不必要的I/O操作。 – 2010-11-24 20:05:58