在Matlab中从磁盘加载保存的对象很慢

时间:2010-07-01 21:02:19

标签: matlab oop loading profiler save

我创建了一个怪物,或者至少有很多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秒或者系统的方法来确定什么在减慢加载速度而不使用探查器?

3 个答案:

答案 0 :(得分:2)

我不将句柄对象保存到磁盘。相反,我有自定义保存/加载方法,它将句柄对象中的信息复制到要保存的结构,从中构造对象及其对加载的依赖性。

因此,加载速度相当快,我可以使用补丁方法在发送给类构造函数之前更新结构(或其中包含的一些数据)。

对于探查器问题:我猜MATLAB在某个时候显示为“开销”。根据我的经验,很难追踪到这一点。

答案 1 :(得分:2)

我没有处理过handle对象,但一般来说,在保存和加载时会有每mxarray开销,所以优化MAT文件就是将其中的数据转换为mxarrays较少的表单。 mxarray是单级数组结构。例如:

strs = {'foo', 'bar', 'baz'};

strs数组包含4个mxarrays:一个单元格数组和3个char数组。

要加快保存和加载速度,请在保存时尝试执行此操作,并在加载时尝试执行此操作。    - 将cellstr转换为2-D char    - 将记录组织的结构和对象转换为平面组织    - 通过在一个数组中存储规范的值集并用索引替换该数组中的对象实例来消除冗余对象。 (这可能与句柄无关,它本身就是这样的。)

“记录组织”意味着N个事物的数组表示为具有标量字段的N长结构阵列; “平面组织”意味着它表示为在其字段中包含N长阵列的标量结构。

查看是否可以将内存中对象图转换为适合几个大型原始数组的规范化表单,类似于将其存储在SQL中的方式。一组数组中所有对象的对象属性,以及数值数组中保存的句柄关系(id,id)元组,可能使用索引作为对象ID的属性数组。

在对象图中“top”类定义的saveobj和loadobj可以进行转换。

此外,如果您使用的是网络文件系统,请尝试使用临时副本在本地文件系统上进行保存和加载。为了阅读,将MAT文件复制到tempdir,然后从那里加载();用于写入,将()保存到tempdir,然后将其复制到网络驱动器。根据我的经验,使用本地I / O可以大大加快save()和load()的速度,即使有时间进行复制,这也是一个很大的净赢(2x-3x加速)。使用tempname()来选择临时文件。

使用分析器,您使用的是“-timer real”选项吗?默认情况下,“profile”显示CPU时间,这是以I / O为中心的东西。使用“-timer real”,您应该看到其他180秒的挂起时间归因于save()和load()。不幸的是,由于它们是内置的,因此探查器不会让你看到它们内部,这可能没有多大帮助。

答案 2 :(得分:0)

您是否尝试过SAVE -v7.3等不同选项?我相信使用这种格式时会有一些差异。