MATLAB:访问加载的MAT文件非常慢

时间:2011-11-28 10:58:21

标签: performance matlab-load

我目前正在开发一个涉及保存/加载相当大的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文件的压缩相关吗?还是缓存变量? 有没有办法防止/避免这种情况?

2 个答案:

答案 0 :(得分:5)

我也知道这个问题。我认为这也与matlab中低效的内存管理有关 - 而且我记得它在交换方面表现不佳。 150MB的文件可以轻松保存大量数据 - 可能比快速分配更多。

我只是使用information by mathworks快速计算了您的示例 在您的情况下,total_size = n_tests*121 + n_tests*(1*4096* 8)约为313MB。

首先我建议将它们保存为格式7(而不是7.3) - 我注意到在阅读这种新格式时性能非常差。仅这一点可能是你放缓的原因。

我个人用两种方式解决了这个问题:

  1. 将数据拆分为较小的集合,然后使用在需要时加载数据的函数或动态创建(可以通过类优雅地完成)
  2. 将数据移动到数据库中。 SQLite和MySQL都很棒。两者都可以有效地处理大型数据集(在TB而不是GB中)。而且SQL语言非常有效,可以快速获取子集进行操作。

答案 1 :(得分:-1)

我使用Windows 64bit,matlab 64bit 2014b测试此代码。

没有保存和加载,计算大约是0.22s, 用'-v7'保存数据文件,然后加载,计算大约0.2s。 用'-v7.3'保存数据文件然后加载,计算大约是4.1s。 所以它与MAT文件的压缩有关。