在使用Matlab对数据进行预处理时,遇到了内存不足的问题,因为数据量太大,在处理完成以前内存已经爆满。如果使用Matlab的 .m 文件对文件进行存储的话,则需要将数据分割成多个文件,对后续的处理造成了不便。HDF5文件则是一种灵活的文件存储格式,有一个最大的好处就是在Matlab的处理过程中可以对它进行扩展写入,也就是说不是所有数据处理完以后一次写入,而是边处理边写入,极大的降低了对系统内存的要求。
HDF5文件类似与一个文件系统,使用这个文件本身就可以对数据集(dataset)进行管理。例如下图所示,HDF5文件中的数据集皆存储根目录 / ,在根目录下存在多个 group ,这样一些 group 类似与文件系统的文件夹,在它们可以存储别的 group ,也可以存储数据集。
使用Matlab创建HDF5文件的函数是 h5create ,使用如下:
filename 为 h5 文件的文件名(不知道什么问题,在我的电脑上使用时,这个函数无法指定路径)。
datasetname 则为数据集的名字,数据集名称必须以 / 开头,比如 /G 。
[30,30,3,inf] 位数据集的大小,比如我的数据集为 30x30 大小的彩色图像,并且我希望数量能够扩展,那么就可以指定最后以为度为inf,以表示数量不限。
Datatype 为数据类型
ChunkSize 为数据存储的最小分块,为了让数据能够具有扩展性,所以为新来的数据分配一定的空间大小,对于一个非常大的数据,这个值设置大一点比较好,这样分块就会少一点。比如我的数据集中, 30x30 大小的彩色图像大概有10万个左右,那么1000个存储在一起较为合适,则 chunksize 设置为:[30,30,3,1000]。
在创建了hdf5文件和数据集以后,则可以对数据集进行写 *** 作以扩展里面的数据。使用Matlab写入HDF5文件的函数是 h5write ,使用如下:
fileName : hdf5文件名
datasetName :数据集名称,比如 /G
data :需要写入的数据,数据的维度应该与创建时一致,比如,设置的数据集大小为 [30,30,3,inf] ,那么这里的 data 的前三个维度就应该是 [30, 30, 3] ,而最后一个维度则是自由的
start :数据存储的起点,如果是第一次存,则应该为 [1, 1, 1, 1] (注意数据维度的一致性),如果这次存了10000个样本,也就是[30,30,3,10000],那么第二次存储的时候起点就应该为[1,1,1,10001]
count 存储数据的个数,同样要根据维度来(其实就是数据的维度),这里为[30,30,3,10000]
Matlab中可以使用 h5info 函数来读取HDF5文件的信息:
然后通过解析fileInfo结构,则可以得到HDF5文件中的数据集名称、数据集大小等等必要信息。
Matlab中可以使用 h5read 函数来读取HDF5文件:
filename :HDF5文件文件名
datasetname :数据集名称
start :从数据集中取数据的其实位置
count :取的数据数量
还是以上面的30x30的彩色图像为例,如果每次需要取1000个,那么第一次取时,start应该设置为[1, 1, 1, 1] ,count设置为:[30, 30 ,3 1000]。第二次取值时,start则应该设置为[1, 1, 1, 1001],count则设置为:[30, 30, 3, 1000]。
MATLAB读取hdf文件
https://blog.csdn.net/good_learner_1/article/details/100047950
版权
1. 显示hdf文件中的数据集以及属性等等信息
2. 读取hdf文件中的数据
3. 读取数据集的属性
4. 创建hdf文件
5. 往新建的hdf中写入数据
6. 给数据集写属性
官方中文文档
1. 显示hdf文件中的数据集以及属性等等信息
h5disp('文件名.hdf')
1
例如:
h5disp('dataset/sample_A_padded_20160501.hdf')
# 输出:
HDF5 sample_A_padded_20160501.hdf
Group'/'
Attributes:
'file_format': '0.2'
Group'/annotations'
Attributes:
'offset': 1520.000000 3644.000000 3644.000000
Dataset'ids'
Size:432
MaxSize:432
Datatype: H5T_STD_U64LE (uint64)
ChunkSize: []
Filters: none
FillValue:0
Dataset'locations'
Size:3x432
MaxSize:3x432
Datatype: H5T_IEEE_F32LE (single)
ChunkSize: []
Filters: none
FillValue:0.000000
Dataset'types'
Size:432
MaxSize:432
Datatype: H5T_STRING
StringLength: variable
Padding: H5T_STR_NULLTERM
CharacterSet: H5T_CSET_UTF8
Character Type: H5T_C_S1
ChunkSize:432
Filters: deflate(4)
Group'/annotations/comments'
Dataset'comments'
Size:17
MaxSize:17
Datatype: H5T_STRING
StringLength: variable
Padding: H5T_STR_NULLTERM
CharacterSet: H5T_CSET_UTF8
Character Type: H5T_C_S1
ChunkSize: []
Filters: none
Dataset'target_ids'
Size:17
MaxSize:17
Datatype: H5T_STD_U64LE (uint64)
ChunkSize: []
Filters: none
FillValue:0
Group'/annotations/presynaptic_site'
Dataset'partners'
Size:2x216
MaxSize:2x216
Datatype: H5T_STD_U64LE (uint64)
ChunkSize: []
Filters: none
FillValue:0
Group '/volumes'
Dataset 'raw'
Size:3072x3072x200
MaxSize:3072x3072x200
Datatype: H5T_STD_U8LE (uint8)
ChunkSize:192x96x7
Filters: deflate(4)
Attributes:
'resolution': 40.000000 4.000000 4.000000
Group'/volumes/labels'
Dataset'clefts'
Size:1250x1250x125
MaxSize:1250x1250x125
Datatype: H5T_STD_U64LE (uint64)
ChunkSize:79x79x4
Filters: deflate(4)
Attributes:
'resolution': 40.000000 4.000000 4.000000
'offset': 1520.000000 3644.000000 3644.000000
Dataset'neuron_ids'
Size:1250x1250x125
MaxSize:1250x1250x125
Datatype: H5T_STD_U64LE (uint64)
ChunkSize:79x79x4
Filters: deflate(4)
Attributes:
'resolution': 40.000000 4.000000 4.000000
'offset': 1520.000000 3644.000000 3644.000000
1
2. 读取hdf文件中的数据
data= h5read('文件名.hdf','数据集名')
1
例如:
raw = h5read('dataset/sample_A_padded_20160501.hdf',' /volumes/raw ')
1
3. 读取数据集的属性
attribute = h5readatt('文件名.hdf','数据集名','属性名')
1
例如:
resolution = h5readatt('dataset/sample_A_padded_20160501.hdf','/volumes/raw','resolution')
1
4. 创建hdf文件
h5create('文件名.hdf','数据集名', 数据大小,'Datatype','数据类型')
1
例如:
h5create('downs_dataset/downsample_A_padded_20160501.hdf','/volumes/raw', size_downs_raw,'Datatype','uint8')
1
5. 往新建的hdf中写入数据
h5write('文件名.hdf','数据集名', 数据变量)
1
例如:
h5write('downs_dataset/downsample_A_padded_20160501.hdf','/volumes/raw', downs_raw)
1
6. 给数据集写属性
h5writeatt('文件名.hdf','数据集名','属性名', 属性变量)
1
例如:
h5writeatt('downs_dataset/downsample_A_padded_20160501.hdf','/volumes/raw','resolution', resolution)
1
A=importdata(file,space,line)其中,file是所读取的文件名,space是特定的分隔符,line是一个数字,指文本中字符串文字的行数,如上文的数据中line=4。
此代码的含义是,line行是title,line+1行到end是数据,按特定分隔符space读取数据。此方法可以读取文本在上和数据在下的文件。
A是一个sturct,其中A.data就是所需的数据了。
exapmle:
A=importdata('test.txt',' ',4)%运行即可取得数据A.data
此方法也可以按以下 *** 作获取:
在文件菜单中选择 file/import data,按照提示进行 *** 作至结束。
在 command 窗口中输入
>>whos
Name Size Bytes Class
data 5x4 160 double array
textdata 4x1 300 cell array
Grand total is 54 elements using 460 bytes
>>data
data =
1 11 111 1111
2 22 222 2222
3 33 333 3333
4 44 444 4444
5 55 555 5555
>>textdata
textdata =
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)