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

Performance MATLAB:访问加载的MAT文件非常慢,performance,matlab-load,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

我目前正在做一个项目,涉及保存/加载相当大的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.75s。当我取消注释要保存/加载文件的行时,在I上一次迭代的计算大约需要6.2秒(保存/加载时间未考虑在内)。差慢了8倍

我使用Matlab7.12.0(R2011a)64位和Windows7 64位,MAT文件保存在v7.3版本中

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

我也知道这个问题。我认为这也与matlab内存管理效率低下有关,而且我记得它在交换方面做得不好。 一个150MB的文件可以很容易地保存大量数据——可能比快速分配的数据还要多

我刚刚使用 在您的例子中,
total_size=n_tests*121+n_tests*(1*4096*8)
大约是313MB

首先,我建议将它们保存在格式7(而不是7.3)中—我注意到在阅读这种新格式时性能非常差。这可能就是你减速的原因

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

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

  • 我用Windows 64位、matlab 64位2014b测试了这段代码

    在不保存和加载的情况下,计算时间约为0.22s, 使用“-v7”保存数据文件,然后加载,计算大约为0.2s。 使用'-v7.3'保存数据文件,然后加载,计算时间约为4.1s。
    因此,它与MAT文件的压缩有关。

    使用单元格而不是矩阵是否有重要原因?事实上,保存/加载矩阵与不保存/加载矩阵的差异小于单元格数组,但问题仍然存在:对于10000个测试,矩阵(10000行)的计算是4.3s,而不是1.5s,对于单元阵列(10000个元素)来说,6.1s比0.4s的大小大约是300MB。。。但是它应该很容易用Matlab64位来管理,不是吗?我将格式从7.3改为7,不再减速,无论是否保存,性能都一样!我将着眼于SQL的未来,因为数据可能会比这大得多。最终,细胞阵列和矩阵之间仍然存在这种差异(前者更快)。它是否与矩阵的大小及其内存管理有关?无论如何,谢谢你的提示+我同意,我个人使用MS SQL Server Express,它附带了一个很好的免费管理工具-如果您是新手,它会很有用。至于连接到dbs,我建议使用此库而不是内置的Matlab库。尝试解决提出的问题和提出的问题