NetCDF或HDF5 XYZ提供时间序列数据在用户的指尖

7视图(30天)
问题: 我做了我的家庭作业很好选择HDF5停止思考选择呢?
一个问题: 的问题HDF5我忽视了吗?我将面临不愉快的惊喜?
目前,我从建筑自动化系统存储时间序列数据,BAS,在大型结构,经常在mat文件命名为X,。每个时间序列存储在一个领域。我使用了面值、数量timeseries。一个典型的X 1000字段和是100 mb,大。我用“格式”十多年。但是,我寻找更好的东西。
目标: 可视化工具的用户有大量的时间序列数据在指尖。与non-Matlab应用程序读取和写入数据文件
到我做了什么:
  1. 试验和使用基于128 kb memmapfiles系统。每个时间序列存储在一系列memmapfiles。一些元数据是嵌入在文件名。它需要太多的编码,我失败了,让它足够快。跳过!
  2. 研究了一些FEX-contributions;滑铁卢文件和矩阵;HDS-Toolbox (RNEL-DB);和……我分享他们的问题的描述和目标,但是……和一个太聪明的我的能力。
  3. 搜索NetCDF和HDF;决定尝试NetCDF;一个实验与matlab高级API (ncwrite, ncread,…);经历了非常贫穷的性能或更糟。
  4. 搜索在FEX NetCDF HDF5。分别有21和13支安打。
  5. 一个性能测试。我使用一个结构,X,各拿一个1346字段。< 66528 x1双>时间序列。X的总大小是0.7 gb。R2012a Windows7多64。测试包括X-structure的数据写入文件的问题(X2hdf)和阅读的数据结构(hdf2X)。相应功能NetCDF几乎相同的与“h5”取代“数控”。netcdf4_classic NetCDF,我使用的格式,和“‘尺寸’,{‘数量’,len_time}”,即固定和有限的长度。
执行时间间隔,以秒为单位
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
方法
HDF532.62.8
NetCDF(1)正正无穷
保存、负载(2)24.4 - 7.3
写入文件,从文件中读(3)3.8 - 1.3
read_hdf (FEX) 3.3
read_netcdf (FEX) 8.1
matfile (4) 74 196
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  1. 结果与NetCFD很奇怪。“正”代表两个数量级HDF5超过相应的值。NetCDF使用……
6个评论
每•艾萨克森
每•艾萨克森 2012年5月9日
加载结构记忆需要7.3秒。然而,这并不是包含在matfile的考验。预先加载结构和X2matfile传递给函数。

登录置评。

答案(3)

肖恩·德Wolski
肖恩·德Wolski 2012年5月7日
你看着MATFILE类新的ML版本吗?它允许您访问变量的变量的能力的mat-file (hdf5)。
这将需要创建许多变量是有效的,我。艾凡:每个时间序列将自己的变量,可以将元数据存储在像你上面描述的变量名称。我知道这是典型的让人皱眉头(a1, a2,…),但它会给你快速和方便地访问您所需要的。
只是一个想法,我可能完全我apolgize如果我离开基地。
6个评论
肖恩·德Wolski
肖恩·德Wolski 2012年5月8日
是的,奥列格的方法将工作得很好,你没有垫与nan值。将元数据存储在一个单独的matfile数组或单元。

登录置评。


T。
T。 2013年1月16日
编辑:T。 2013年1月16日
我还做了实验与netCDF在matlab的性能。一些研究结果:
  • matlab高级功能ncread ncwrite有一些性能问题,设计:每个命令都需要matlab netCDF文件的读头为确定netCDF命令传递到低层次功能。getVar netcdf。putVar等等。
  • 所花费的时间读头netCDF4 netCDF文件是更大的比netCDF3 (HDF5), netCDF3简单得多。同时,头的复杂性增加的数量变量在一个文件中,;几十万通常是可行的,给了一个非常糟糕的表现。
为了提高netCDF性能,如果你可以试着用版本3。否则,尝试调用netcdf低层次功能。xxx而不是高水平的功能。
matlab需要什么(恕我直言)是一个高水平,建成的,面向对象,函数来处理netCDF文件。在这个函数netCDF文件保持开放,头是缓存。
下面是一些示例代码来说明这个问题
格式= {“经典”,“netcdf4”}
流(1,“\ nFormat = = % s \ n”,{:}格式);
如果存在(“test.nc”,“文件”)
删除(“test.nc”)
结束
据nvar = 100;
jj = 0:4
流(1,' \ nvariables = % d \ n '据nvar * (jj + 1));
2 =(1:据nvar) +据nvar * jj
nccreate (“test.nc”sprintf (“var % 03.0 f”(二),
“维度”,{“r”400年“c”1},
“格式”,{:}格式);
结束
2 =(1:50:据nvar) +据nvar * jj
ncwrite (“test.nc”sprintf (“var % 03.0 f”、(二)、重塑(峰值(20),[],1));
结束
2 =(1:50:据nvar) +据nvar * jj
抽搐
ncread (“test.nc”sprintf (“var % 03.0 f”(二));
toc
结束
结束
结束

马尔科姆Lidierth
马尔科姆Lidierth 2013年3月3日
@Per
我怀疑的一些问题与memmapfile可能与使用多个128 kb memmapfiles。每一个需要系统资源。滑铁卢文件实用程序的sigTOOL项目,我也有过类似的问题。在这种情况下,每个通道是由memmmapfile表示对象,但可能有许多数百个频道。我使用的“诡计”是动态实例化memmapfile实例只有在需求(非首次访问文件时),并在不需要时摧毁他们。这使sigTOOL许多Gb的使用与文件。
HDF5文件,你仍然可以使用内存映射通过检索数据字节抵消如果:
  1. 数据分块
  2. 不压缩的数据
这是一个API的限制而不是文件格式我相信,你可以使用外部机制,大型数据文件分解成单独的组件离开HDF5不知道内部的“组块”和使用外部压缩之前写数据。
sigTOOL dev版本的我的解决方案是使用一个文件夹,而不是一个文件的数据。每个文件夹中,有几个交叉引用文件让我混合 * .mat, *。本,*。hdf5,*。xml等。它是丑陋的可能,提出了同步问题,但它让我利用不同的数据集的最佳格式没有将我与他们的局限性。
问候毫升

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!