微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

加载大量数据时如何并行化

如何解决加载大量数据时如何并行化

我一直在努力加速将大量大型数据文件加载到自定义类对象中的 MATLAB 代码。我的两个类是 DataGroupDataObj,其中每个 DataObj 加载一个独立的 .mat 数据文件DataGroup 包含 DataObj 到能够访问分布在多个文件中的信息。我们以这种方式分发它,因为每个文件都包含一个具有完全不同字段集的结构,因此没有一种很好的方法将它们编译在一起。由于 .mat 文件是一种压缩格式,我相信 load间的很大一部分实际上是用于解压,而不是硬盘读取。

下面是我试图加速的代码的基本版本。我的问题是 parfor 没有帮助,实际上使事情变得更糟,因为将大型 rawData 广播回客户端需要大量开销。我知道开销是原因,因为我不小心设置了 saveobj 过载设置 obj.rawData=[];,这显着提高了速度。 nameID 属性设置正确,所以我知道正在加载数据。

saveObj 重载很重要,因为 MATLAB 在 worker 之间广播变量(并且可能返回到客户端)的方式是“保存”它们,然后将它们“加载”到目标中。由于我有一个自定义类,如果我重载 saveObj,它将在发送回客户端之前被调用。我还尝试重载 loadobj 以再次重新加载数据。这保留了信息,但速度比序列化稍差。

这是我在一个小数据集上的计时结果。不同的 parfor 方法指示 saveobjloadobj 重载是启用还是注释掉。

模式 时间
for 循环 16 秒
parfor with saveobjloadobj(数据加载两次) 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 举报,一经查实,本站将立刻删除。