我目前正在开发一个涉及保存/加载相当大的MAT文件(大约150 MB)的项目,我意识到访问加载的单元格数比在脚本或函数内创建的等效版本慢得多
我创建了这个示例来模拟我的代码并显示差异:
clear; clc;
disp('Test for computing with loading');
if exist('data.mat', 'file')
delete('data.mat');
end
n_tests = 10000;
data = {};
for i=1:n_tests
data{end+1} = rand(1, 4096);
end
% disp('Saving data');
% save('data.mat', 'data');
% clear('data');
%
% disp('Loading data');
% load('data.mat', '-mat');
for i=1:n_tests
tic;
for j=1:n_tests
d = sum((data{i} - data{j}) .^ 2);
end
time = toc;
disp(['#' num2str(i) ' computed in ' num2str(time) ' s']);
end
在此代码中,不保存或加载MAT文件。 i上一次迭代的平均时间是0.75秒。当我取消注释保存/加载文件的行时,i上一次迭代的计算大约需要6.2秒(不考虑保存/加载时间)。相差8倍!
我使用的是带有Windows 7 64位的64位MATLAB 7.12.0(R2011a),MAT文件以v7.3版本保存。
它可以与MAT文件的压缩相关吗?还是缓存变量? 有没有办法防止/避免这种情况?
答案 0 :(得分:5)
我也知道这个问题。我认为这也与matlab中低效的内存管理有关 - 而且我记得它在交换方面表现不佳。 150MB的文件可以轻松保存大量数据 - 可能比快速分配更多。
我只是使用information by mathworks快速计算了您的示例
在您的情况下,total_size = n_tests*121 + n_tests*(1*4096* 8)
约为313MB。
首先我建议将它们保存为格式7(而不是7.3) - 我注意到在阅读这种新格式时性能非常差。仅这一点可能是你放缓的原因。
我个人用两种方式解决了这个问题:
答案 1 :(得分:-1)
我使用Windows 64bit,matlab 64bit 2014b测试此代码。
没有保存和加载,计算大约是0.22s, 用'-v7'保存数据文件,然后加载,计算大约0.2s。 用'-v7.3'保存数据文件然后加载,计算大约是4.1s。 所以它与MAT文件的压缩有关。