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

Ben*_* B. 3 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
Run Code Online (Sandbox Code Playgroud)

在此代码中,不保存或加载MAT文件.i上一次迭代的平均时间是0.75秒.当我取消注释保存/加载文件的行时,i上一次迭代的计算大约需要6.2秒(不考虑保存/加载时间).相差8倍!

我使用的是带有Windows 7 64位的64位MATLAB 7.12.0(R2011a),并且使用版本v7.3保存了MAT文件.

它可以与MAT文件的压缩相关吗?还是缓存变量?有没有办法防止/避免这种情况?

bde*_*caf 5

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

我只是使用mathworks信息快速计算你的例子 在你的情况下total_size = n_tests*121 + n_tests*(1*4096* 8)大约是313MB.

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

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

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