上次说起遇到两个 Matlab 的效率问题,还剩下 save , load 没说。不过这个问题的结论挺简单的,就是在 save 的时候尽量指定使用-v6 选项。
1、save, load 函数的基本情况
有几种情况需要用到 save、load
- 如果过程中数据量太大,不能全部保留在内存中,只能通过 save、load 的方式分块处理。
- 用来保存计算结果,以备下次使用。
save 的选项(由 save 函数的最后一个参数控制,省略时使用默认值)
- -v7.3 :支持超过 2G 的保存文件。
- -v7.0 :支持数据压缩。
- -v6 :在-v4 的基础上,还支持多维矩阵、cell 和结构数组。
- -v4 :可保存二维实数、字符型矩阵和稀疏矩阵
一般默认选项为-v7。
2、尽量使用-v6 选项
关于-v6 和默认-v7 的速度可参见下面的例子:
clear all
a.b = rand(1000, 1000);
a.c = a;
>> tic; for i = 1:10, save('A.mat', 'a'); end; toc
Elapsed time is 6.877207 seconds.
>> tic; for i = 1:10, load('A.mat'); end; toc
Elapsed time is 1.244955 seconds.
>> tic; for i = 1:10, save('A.mat', 'a', '-v6'); end; toc
Elapsed time is 3.415954 seconds.
>> tic; for i = 1:10, load('A.mat'); end; toc
Elapsed time is 0.174211 seconds.
从此处可见,使用-v6 选项的 save 比默认-v7 的速度要快 1 倍;在 load 时节约的时间更多,导入 v6 型的 mat 文件比 v7 型文件要快 7 倍。
那使用-v4 的速度是不是更快呢?测试发现没有明显区别。而且-v6 比-v4 支持的数据类型要多得多,所以推荐全部使用-v6。
当然-v7 选项并不是没有好处的,使用 v7 选项得到的 mat 文件要小一些,不过现在硬盘这么便宜,在大数据量的处理中还是速度更重要一些。
Q. E. D.