您现在的位置:首页 >> 技术文章 >> MATLAB技术 >> 内容

matlab代做highspeedlogic★提高save()函数数据存储性能

时间:2018-11-28 20:27:50 点击:

  核心提示:matlab代做,FPGA代做,淘宝,专业代做MATLAB、FPGA博士/硕士/本科毕业设计、项目仿真、Coursework、Assignment...

matlab代做FPGA代做淘宝专业代做MATLABFPGA博士/硕士/本科毕业设计项目仿真CourseworkAssignment

提高save()函数数据存储性能

前段时间翻译了一篇《提高fwrite和fprintf函数的I/O性能》,今天http://undocumentedmatlab.com/又添加了一篇《Improving save performance》,现在赶紧翻译原文和大家分享。

fwrite函数通常用来存储预定格式的二进制数据,但是有时我们不需要或者并不想使用这些低级函数。MATLAB建save函数,很容易、方便进行数据存储。此数据能够稍后使用load函数,重新加载到MATLAB。本文将讨论一些save函数的使用技巧。

MAT是MATLAB中save函数默认的保存数据格式,这种文件的编码格式是公开的(点击这里),并和CC#Java等有相关接口。MATLAB 6或更早版本不会自动压缩MAT文件;MATLAB 7.0(R14)到7.2(R2006a)使用GZIP格式压缩MAT文件;MATLAB 7.3(R2006b)到至今,是使用HDF5-variant格式进行压缩(视乎也是一种GZIP格式)。注意,V7.3版本MAT文件并不是一个纯粹的HDF5文件,而是HDF5的一个变种,它使用一种未公开的内部格式。

下表列出了save函数的可用选项

选项 版本 格式 压缩 特性
-v7.3 R2006b(7.3) 二进制(HDF5) GZIP 超过2G文件,类对象
-v7 R14(7.0) 二进制(MAT) GZIP 压缩,Unicode编码
-v6 R8(5.0) 二进制(MAT) N-D数组,Cell数组,结构体
-v4 所有版本 二进制(MAT) 二维数据
-ascii 所有版本 文本格式 常规文本文件

HDF5使用一个通用的格式来存储任何可以想象到的数据类型,其中包含一段数据用来描述文件的内容。其实,MATLAB的HDF5默认是不压缩非数值数据(比如结构体和Cell数组)。因此HDF5文件通常比非HDF5格式的MAT更大、更慢,尤其是数据中包含Cell数组或结构体。这条规律也适用于纯HDF文件(通过hdf和hdf5函数存储)和V7.3格式MAT文件。

也许正是这个原因,在首选项中save函数默认使用-V7选项,甚至在支持V7.3格式的最新MATLAB也如此。该首选项可以通过Preferences/General或者save -v7/-v7.3进行修改

 

多年来,MathWorks已经修正许多低效读取HDF5文件的函数,这些修正程序提供一些旧版MATLAB的补丁,并建议读者下载并安装相应补丁程序。如果您不是使用MATLAB的最新版(目前是R2013a),但是HDF5在性能和压缩方面还有一些Bug,它们会影响数据保存。

由于HDF5使用通用描述文件头,以及存在一些已知的Bug,大家可能认为在保存和加载MAT文件时,-V7.3(HDF5)版本将总是比-V7(MAT)版本慢,但是情况并不总是这样。
  1. A = randi(20,1000,1200,40,'int32');  % 48M int32s => 184 MB
  2. B = randn(500,1000,20);              % 80M doubles => 78 MB
  3. ops.algo = 'test';                   % non-numeric

  4. % 使用-v7格式保存 
  5. tic, save('test1.mat','-v7','ops','A','B'); toc
  6. % => Elapsed time is 11.940455 seconds.   % file size: 114 MB

  7. % 使用-v7.3格式保存 
  8. tic, save('test2.mat','-v7.3','ops','A','B'); toc
  9. % => Elapsed time is 6.963135 seconds.    % file size: 116 MB
复制代码
在上面代码中,恰恰相反,HDF5格式存储要快得多。因此我们需要通过逐个案例的方式,检查特定的数据存储。对于有些数据V7可能更好,但是对其它的V7.3可能更好。一般来说,如果数据中包含许多非数字元素,V7.3版HDF5将比V7版MAT文件更大、更慢;但是如果数据主要是数字,则V7.3将更小、更快。

令人惊讶的是,有时我们往往愿意牺牲压缩性来获取更好的存储和加载性能。比如savefast函数就是使用未压缩HDF5格式来存储数字数据,大家可以在MathWorks File Exchange中下载,函数语法如下
  1. tic, savefast('test3.mat','ops','A','B'); toc
  2. % => Elapsed time is 3.164903 seconds.   % file size: 259 MB
复制代码
使用未压缩的-v6版本save函数,有时可能获得更好性能。-v6通过牺牲文件大小,在性能上一般均高于-v7和-v7.3,但是-v6不能保存Unicode和类对象,且文件被限制为最大2GB。

另外,根据数据中的数字和非数字比例,选择不同的数据存储格式是明智的。下表比较了184MB数字和不同大小的cell数组进行存储性能比较
  1. A = randi(20,1000,1200,40,'int32');  % 48M int32s => 184 MB
  2. B = num2cell(randn(1,dataSize));  % dataSize = 1e3, 1e4, 1e5, 1e6
复制代码
数字数据 非数字数据 save -V7.3 save -V7 save -V6 savefast
184MB 0.114MB 3.8秒,43MB 9.3秒,40MB 1.6秒,183MB 2.1秒,183MB
184MB 1.14MB 4.3秒,46MB 9.5秒,40MB 1.6秒,184MB 2.1秒,186MB
184MB 11.4MB 12.6秒,78MB 9.9秒,41MB 2.7秒,189MB 11.1秒,219MB
184MB 114MB 87.5秒,402MB 13.9秒,50MB 5.8秒,224MB 85.2秒,544MB

如前所述,表中可以清楚的看到,-V7.3(HDF5)格式和savefast函数并米有压缩非数字数据。不过,我们可以底层HDF5原始M-代码MEX C代码进行数据压缩。

从上面的比较,可以得到一个通用结论,在特定情况下,压缩数据额外使用的时间,并不能通过I/O性能抵消。因此,一般来说尽可能使用-V6格式。

虽然-V6不压缩数据,但它确实比MATLAB内存,使用更紧凑的方式存储数据。因此,尽管测试中Cell数组占用114MBMATLAB内存,但是存储文件却只有61MB=244MB-183MB。

通过手动将数据序列化为uiit8字节,可以让数据存储更加紧密,因此在存储非数字数据时大小和性能将有戏剧化的提升。在加载文件时,简单的反序列化加载的数据。这里推荐使用Christian Kothe编写的《Fast serialize/deserialize》函数。使用序列化数据,尤其是save -v6不能保存的数据类型,在性能和文件大小上绝对是惊人的。
  1. B = num2cell(randn(1,1e6));  % 1M cell array, 114 MB in Matlab memory
  2. B_ser = hlp_serialize(B);
复制代码
变量 内存 save -v7.3 save -v7 save -v6 savefast
B 114MB 83秒,361MB 4.5秒,9.2MB 3.5秒,61MB 83秒,361MB
B_ser 7.6MB 1.21秒,7.4MB 1.17秒,7.4MB 0.93秒,7.6MB 0.94秒,7.6MB

以这种方式序列化数据,能够让save -v6保存Unicode和类对象,同时支持存储超过2G的文件。一个用户反馈说,使用序列化方式存储2.5GB的Cell数组,时间从数小时减少了几分钟。除了性能优势,使用序列化存储类对象可以避免内存泄露(在MATLAB R2011b~R2012b,保存类对象到MAT文件存在内存泄露BUG)。

对于184MB纯数字数据,下面比较 hdf5write,h5create + h5write,save , savefast几种方法的性能(注意hdf5write将被弃用,MathWorks推荐使用h5create + h5write)

hdf5write h5create + h5writ
(Deflate=0)
h5create + h5writ
(Deflate=1)
save -v7.3 save -v7 save -v6 savefast
文件大小 183MB 366MB 55MB 42MB 40MB 183MB 183 MB
普通硬盘 4.4秒 14.3秒 7.4秒 6.1秒 10.8秒 4.2秒 4.3秒
固体硬盘 2.1秒 0.2秒 4.5秒 4.1秒 9.5秒 1.5秒 1.6秒

如前所述,大部分时候MATLAB的HDF5格式并不是最优选择。使用底层HDF5函数可以获得更好的性能,而不是高级的hdfwrite和hdf5read函数。

除了HDF5,MATLAB也支持HDF4标准,但是两者完全不兼容,它们使用不同的数据格式和采用不同的设计。 通常HDF4性能远低于HDF5

虽然保存-V7.3格式数据在几种方法中相对较慢。但是有一个额外的特例,当我们只需要更新或加载一部分数据时(matlabfile接口,在R2011b版本引入),此时使用V7.3将能够节省大量的I/O资源。
  1. new = matfile('newfile.mat','Writable',true);
  2. new.X(6:10,6:10) = magic(5);
  3. partOfX = new.X(1:8,1:8);
复制代码

Tags:SAVE() 
作者:highspeedlogic 来源:highspeedlogic
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
  • matlab代做|matlab专业代做|matlab淘宝代做(www.hslogic.com) © 2018 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科毕业设计、课题设计、论文,毕业论文,Coursework、Eassy、Assignment