在这里没有人知道如何来的删除的从MATLAB文件中的变量?我知道,你可以添加变量使用save -append方法现有的MATLAB文件,但有关于如何从文件中删除变量的文档。

在有人说,“只是保存吗?”,其因为我节省了中间处理步骤到磁盘,以缓解内存的问题,并在年底将有近10 GB每次分析程序的中间数据。谢谢!

有帮助吗?

解决方案

有趣的是,可以使用与 SAVE -append选项有效从.MAT文件擦除数据。注意,来自文档的摘录(粗体由我添加的):

  
    

有关MAT文件,-append增加了新的变量添加到文件或替换在工作区现有变量的值与保存的值。

  

在换句话说,如果在你的.MAT文件中的变量称为A,可以节省超过与变量的的复制A的(你已经设置为[])使用-append选项。仍然会有一个称为A在.MAT文件变量,但是这将是空的,从而减少总文件大小。

下面是一个例子:

>> 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字节。变量是仍然在那里,但它是空的。

其他提示

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文件格式,并会自行消失,如果每一个变量是在它自己的文件。

此外,尽量保持在本地文件系统这些文件;这将是比网络驱动器快了很多。如果他们需要去一个网络驱动器上,可考虑做保存()和load()上的本地临时文件(可能与tempname选择()),然后将它们从网络驱动器复制到/。 Matlab的保存和负载往往是与本地文件系统快很多,足以使局部SAVE / LOAD加上副本可以大幅净赢。


这是一个基本的实现,可以让你使用熟悉的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

这里的负载()等效。

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()是卫生组织的( ' - 文件')的等价物。

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

这样做,我知道的唯一方法是使用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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top