我已经创建了一个怪物,或者至少有很多MATLAB处理的类互相指向对方。例如,一个实验(句柄)是一组轨道(句柄),其中包含运行(句柄)和重定向(句柄)。然后,轨道点包到包含它们的实验中,跑步和重新定位指向它们来自的轨道,它们也指向前面和后面的下一轮&重新定位。
我已经意识到,当涉及到加载或保存文件时,所有这些交叉指向可能会混淆MATLAB,所以我尽可能地将句柄定义为瞬态,并使用set.property方法来定义回指针。例如
Track < Handle
properties(Transient = true)
expt;
end
endExperiment
properties(AbortSet = true)
track;
end
methods
function set.track(obj, value)
if (~isempty(value) && isa(value, 'Track'))
value.expt = obj;
end
obj.track = value;
end
end这似乎加快了从磁盘加载的速度,但我认为我仍然缺少一些东西。
我可以保存一个实验到磁盘,创建一个48 MB的文件,大约7秒。但是从磁盘加载文件需要3分钟。我曾尝试使用分析器来定位慢速点,但它报告的总时间约为50毫秒。
问题:
是否有人有将处理对象保存到磁盘的经验,并可以推荐加速加载的一般做法?
是否有任何方法可以让分析器报告matlab正在用其他179.95秒做什么,或者一种系统的方法来确定什么在不使用分析器的情况下减缓加载?
发布于 2010-07-02 02:18:14
我不将句柄对象保存到磁盘。相反,我有自定义的保存/加载方法,这些方法将句柄对象中的信息复制到用于保存的结构中,然后构造对象及其对加载的依赖关系。
因此,加载是相当快的,而且我可以有一个补丁方法,允许我在将其发送到类构造函数之前更新结构(或其中包含的一些数据)。
对于分析器问题:我猜MATLAB这次在某个地方显示为“开销”。在我的经验中很难找到这一点。
发布于 2010-07-06 19:15:00
我还没有处理过句柄对象,但是一般来说,在保存和加载时,每个mxarray都有开销,所以优化MAT文件就是将它们中的数据转换成一个具有较少mxarray的表单。An数组是一种单层数组结构。例如:
strs = {'foo', 'bar', 'baz'};strs数组包含4个mxarrays:一个单元格数组和3个char数组。
若要加速保存和加载,请尝试在保存时执行此操作,在加载时执行反向操作。-将cellstr转换为二维char --将记录组织的结构和对象转换为平面组织的--通过在一个数组中存储一个规范的值集并将对象实例替换为该数组中的索引来消除冗余对象。(这可能与句柄无关,因为句柄本身就是这样的。)
“记录组织”是指N个事物的数组被表示为一个包含标量字段的N长结构数组;“平面组织”表示它表示为包含其字段中N个长数组的标量结构。
查看是否可以将内存中的对象图转换为适合于几个大型基元数组的规范化形式,类似于如何将其存储在SQL中。一组数组中所有对象的对象属性,以及数字数组中以(id,id)元组形式持有的句柄关系,可能会使用属性数组中的索引作为对象id。
在对象图中的"top“类中定义的saveobj和loadobj可以完成转换。
此外,如果您正在使用网络文件系统,请尝试使用临时副本在本地文件系统上进行保存和加载。要读取,请将MAT文件复制到tempdir,然后从那里加载();对于写入,请将()保存到tempdir,然后将其复制到网络驱动器。根据我的经验,使用本地I/O保存()和load()的速度要快得多,足够大的网速(2x-3x加速比),即使有时间做副本。使用tempname()来选择临时文件。
在分析器中,您是否使用了"-timer real“选项?默认情况下,“配置文件”显示CPU时间,这是以I/O为中心的内容。使用"-timer real",您应该可以看到那些归因于save()和load()的其他180秒的墙壁时间。不幸的是,由于它们是内置的,分析器不会让您查看它们的内部,这可能没有多大帮助。
发布于 2010-07-02 06:24:42
您是否尝试过SAVE的不同选项,如-v7.3?我认为在使用这种格式时有一些不同之处。
https://stackoverflow.com/questions/3161649
复制相似问题