【发布时间】:2010-07-01 21:02:19
【问题描述】:
我创建了一个怪物,或者至少创建了很多相互指向的 MATLAB 句柄类。例如,实验(句柄)是一组轨道(句柄),其中包含运行(句柄)和重新定向(句柄)。然后轨道指向包含它们的实验,运行和重新定向指向它们来自的轨道,并且它们还指向下一次运行和重新定向的前后。
我已经意识到,在加载或保存文件时,所有这些交叉指向可能会使 MATLAB 感到困惑,所以我尽可能将句柄定义为 Transient 并使用 set.property 方法来定义后面的指针。比如
Track < Handle
properties(Transient = true)
expt;
end
end
Experiment
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
这似乎加快了从磁盘加载的速度,但我认为我仍然缺少一些东西。
我可以在大约 7 秒内将实验保存到磁盘,创建一个 48 MB 的文件。但是从磁盘加载文件需要 3 分钟。我尝试使用分析器来定位慢点,但它报告的总时间约为 50 毫秒。
问题:
有没有人有将句柄对象保存到磁盘的经验并且可以推荐一般做法来加快加载速度?
有没有什么方法可以让分析器报告 matlab 在另外 179.95 秒内做了什么,或者有系统的方法来确定是什么在不使用分析器的情况下减慢了加载速度?
【问题讨论】:
-
您忘记附加用于保存和加载数据的代码。如果不知道这段代码,就不可能给你一个有价值的答案。
-
我正在使用标准的 matlab 保存和加载命令保存文件以保存到 .mat 文件。
-
Handle 对象的性能一般都很差,见这里:stackoverflow.com/questions/1446281/matlabs-garbage-collector/…
-
这篇文章涉及与嵌套句柄相关的内存释放问题。我不确定这是从磁盘加载对象问题的根本原因。我认为我的问题的根本原因是我在 c++/java 行上组织了我的数据,小对象是基本单元,组织成对象数组。 MATLAB 在处理数据数组时要快得多。我的临时解决方案是尽可能多地声明临时字段,然后在加载时重新计算它们,这要快得多。
-
MATLAB 尝试在每个函数调用上释放内存(运行垃圾收集器),因此两种形式的引用(句柄对象和嵌套函数)的性能都比值对象差。我也不确定这是从磁盘加载对象问题的根本原因。
标签: matlab oop loading profiler save