问题描述
我一直在努力加速将大量大型数据文件加载到自定义类对象中的 MATLAB 代码。我的两个类是 DataGroup
和 DataObj
,其中每个 DataObj
加载一个独立的 .mat 数据文件,DataGroup
包含 DataObj
到能够访问分布在多个文件中的信息。我们以这种方式分发它,因为每个文件都包含一个具有完全不同字段集的结构,因此没有一种很好的方法将它们编译在一起。由于 .mat 文件是一种压缩格式,我相信 load
时间的很大一部分实际上是用于解压,而不是硬盘读取。
下面是我试图加速的代码的基本版本。我的问题是 parfor
没有帮助,实际上使事情变得更糟,因为将大型 rawData 广播回客户端需要大量开销。我知道开销是原因,因为我不小心设置了 saveobj
过载设置 obj.rawData=[];
,这显着提高了速度。 name
和 ID
属性设置正确,所以我知道正在加载数据。
saveObj 重载很重要,因为 MATLAB 在 worker 之间广播变量(并且可能返回到客户端)的方式是“保存”它们,然后将它们“加载”到目标中。由于我有一个自定义类,如果我重载 saveObj,它将在发送回客户端之前被调用。我还尝试重载 loadobj
以再次重新加载数据。这保留了信息,但速度比序列化稍差。
这是我在一个小数据集上的计时结果。不同的 parfor
方法指示 saveobj
和 loadobj
重载是启用还是注释掉。
模式 | 时间 |
---|---|
for 循环 |
16 秒 |
parfor with saveobj 和 loadobj (数据加载两次) |
18 秒 |
parfor with saveobj (数据丢失) |
7 秒 |
parfor 没有重载 |
160 秒 |
是否有更好的方法来并行处理以加快运行速度?我考虑过先加载几个键 DataObj
,然后在后台加载其余的,更新DataGroup.dataSet
属性也在后台,但不知道如何做到这一点。我尝试使用 parfeval
,但不知道如何让工作人员更新客户端上的对象。
运行脚本
% Data files are all .mat containing a single structure with many different fields
% The fieldnames are different for every data file
% Data files can range from a couple kB to over 1GB
filenames = {'file01.mat','file02.mat',...,'file100.mat'};
tic; allData = DataGroup(filenames); toc
数据组.m
classdef DataGroup < handle
properties
dataSet
end
methods
function obj = DataGroup(filenames)
dataSet = repmat(DataObj.empty(),1,length(filenames));
parfor iFile = 1:length(filenames)
dataSet(iFile) = DataObj(filenames{iFile});
end
obj.dataSet = dataSet;
end
end
DataObj.m
classdef DataGroup < handle
properties
rawData
name
ID
srcFile
end
methods
function obj = DataObj(filename)
obj.rawData = load(filename);
names = fieldnames(obj.rawData)
obj.name = names{1};
obj.ID = parse(obj.name); %some basic character parsing
obj.srcFile = filename;
end
function b = saveobj(obj)
b = obj;
b.rawData = [];
end
end
methods (Static)
function obj = loadobj(b)
obj = DataObj(b.srcFile);
end
end
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)