HDF5: 读写速度与文件的大小

79 篇文章 13 订阅
30 篇文章 0 订阅

HDF5是一种优秀的文件格式,特别是对于大型的文件,是一个很好的选择。
任何事情都是一个平衡,当源文件是.csv文件时,你转为HDF5文件,你的目标是什么,要读(写)速度,还是HDF5文件的大小?

一、效率与文件的大小两者不可兼得
HDF5文件,如果不采用压缩的方式,格式会比源文件大不小,以CSV为例,可能会增大不少。但是在没有压缩的情况下,速度是最佳的。

如果你不仅需要速度,而且还需要控制文件的大小,这时,你可以选择压缩的方式,常用的有gzip,lzf等。这两者差异不太大,总体上差不多。lzf方式可能稍好一些,可能不同的环境下,得到的情况有所不同。

在控制文件大小的同时,这个效率的损失有多大?

我有一个CSV文件夹,CSV总大小约59.3M =>
gzip compress-level 2 =>8.5 M 读速度:0.5s
gzip compress-level 6 =>7.3M 读速度: 0.7s (compress level 0-9值)
lzf =>13M 读速度:0.4s (无compress level)

不压缩的情况是多少 =>76M 读速度:0.15s

我这里不是用SSD,如果用SSD的话,速度可能还会快不少。

二、场景的选择

有些情况下,存储资源紧张,有时侯需要更快的读取效率,具体要看具体场景需要。

要在Java中读写HDF5文件,需要使用HDF5 Java API。以下是一个读取HDF5文件的示例代码: ```java import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.object.Dataset; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.h5.H5File; public class HDF5Reader { public static void main(String[] args) { String FILENAME = "test.h5"; String DATASETNAME = "mydataset"; H5File file = null; try { file = (H5File) FileFormat.getFile(FILENAME); if (file == null) { System.err.println("Failed to open file"); return; } Dataset dataset = (Dataset) file.get(DATASETNAME); if (dataset == null) { System.err.println("Failed to read dataset"); return; } int rank = dataset.getRank(); long[] dims = dataset.getDims(); int dataType = dataset.getDataType().getDatatypeClass(); Object data = dataset.read(); // Do something with the data... } catch (Exception e) { e.printStackTrace(); } finally { if (file != null) { try { file.close(); } catch (Exception e) { e.printStackTrace(); } } } } } ``` 在上面的代码中,我们首先打开HDF5文件,然后读取指定的数据集。我们可以通过 `getRank()` 方法获取数据集的维度,通过 `getDataType()` 方法获取数据集的数据类型,通过 `getDims()` 方法获取数据集的维度大小,通过 `read()` 方法读取数据集的数据。最后,我们可以对获取到的数据进行操作。 要写入HDF5文件,我们需要使用 `H5.H5Fcreate()` 方法创建新文件,然后使用 `H5.H5Dcreate()` 方法创建数据集,并使用 `H5.H5Dwrite()` 方法写入数据。以下是一个写入HDF5文件的示例代码: ```java import ncsa.hdf.hdf5lib.H5; import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException; import ncsa.hdf.object.FileFormat; import ncsa.hdf.object.h5.H5File; public class HDF5Writer { public static void main(String[] args) { String FILENAME = "test.h5"; String DATASETNAME = "mydataset"; int RANK = 2; long[] DIMS = { 4, 6 }; float[][] DATA = { { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }, { 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f }, { 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f }, { 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f } }; H5File file = null; try { file = (H5File) FileFormat.createFile(FILENAME, FileFormat.FILE_CREATE_DELETE); if (file == null) { System.err.println("Failed to create file"); return; } int file_id = file.open(); int dataspace_id = H5.H5Screate_simple(RANK, DIMS, null); int dataset_id = H5.H5Dcreate(file_id, DATASETNAME, H5.H5T_NATIVE_FLOAT, dataspace_id, H5.H5P_DEFAULT, H5.H5P_DEFAULT, H5.H5P_DEFAULT); H5.H5Dwrite(dataset_id, H5.H5T_NATIVE_FLOAT, H5.H5S_ALL, H5.H5S_ALL, H5.H5P_DEFAULT, DATA); H5.H5Sclose(dataspace_id); H5.H5Dclose(dataset_id); file.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (file != null) { try { file.close(); } catch (Exception e) { e.printStackTrace(); } } } } } ``` 在上面的代码中,我们首先创建一个HDF5文件,然后创建一个数据集,并将数据写入该数据集。我们可以通过 `H5.H5Screate_simple()` 方法创建数据集的数据空间,通过 `H5.H5Dcreate()` 方法创建数据集,通过 `H5.H5Dwrite()` 方法写入数据。最后,我们可以通过 `H5.H5Sclose()` 和 `H5.H5Dclose()` 方法关闭数据集和数据空间,通过 `file.close()` 方法关闭文件
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值