对于我的项目,我必须使用OpenCV保存.yml文件。这是.yml文件的结构。
Block stride: [ 8, 8 ]
Cell size: [ 8, 8 ]
nbins: 9
blockhistsize: 36
Level1: 1
blocksperimg1: [ 152, 45 ]
Elements1: 246240
Scale1: 1.
Width1: 1224
Height1: 370
Features1:
- 4.1452873498201370e-02
- 3.7708058953285217e-02
- 5.5512674152851105e-02
------------------------
------------------------
Features2:
- 4.1452873498201370e-02
- 3.7708058953285217e-02
- 5.5512674152851105e-02
------------------------
------------------------
Features3:
- 4.1452873498201370e-02
- 3.7708058953285217e-02
- 5.5512674152851105e-02
------------------------
------------------------
Features4:
- 4.1452873498201370e-02
- 3.7708058953285217e-02
- 5.5512674152851105e-02
------------------------
------------------------
我有大约10,000个文件,每个文件的大小约为60 MB。我必须在MATLAB中读取那些yml文件。我使用yamlmatlab来读取这些文件。
的问题
阅读一个 yml文件需要五分钟。因为我有大约10,000个文件,所以我会浪费很多时间。如果有人可以提出替代路线,我将不胜感激。您可以找到一个简单的yml文件here。
答案 0 :(得分:1)
好的,所以我在这个网站上写了一个基本的文本解析器。我无法获取您发布的文件(此处阻止文件共享站点)。这会使用正则表达式进行大量文本解析。我承认它不是最干净的,可能做得更容易,但它是一个开始。
function yaml = yamlparse(file)
str = fileread(file);
stride = regexpi(str,'Block stride: \[([ 0-9,]*)\]','tokens','once');
cellSize = regexpi(str,'Cell size: \[([ 0-9,]*)\]','tokens','once');
nbins = regexpi(str,'nbins: *([0-9]*)','tokens','once');
blockhistsize = regexpi(str,'blockhistsize: *([0-9.]*)','tokens','once');
level = regexpi(str,'Level[0-9]*: *([0-9]*)','tokens','once');
blocksperimg = regexpi(str,'blocksperimg[0-9]: \[([ 0- 9.,]*)\]','tokens','once');
elements = regexpi(str,'Elements[0-9]: *([0-9.]*)','tokens','once');
scale = regexpi(str,'Scale[0-9]*: *([0-9.]*)','tokens','once');
width = regexpi(str,'Width[0-9]*: *([0-9.]*)','tokens','once');
height = regexpi(str,'Height[0-9]*: *([0-9.]*)','tokens','once');
yaml.stride = eval(['[',stride{1},']']);
yaml.cell_size = eval(['[',cellSize{1},']']);
yaml.nbins = str2double(nbins);
yaml.blockhistsize = str2double(blockhistsize);
yaml.level = str2double(level);
yaml.blocksperimg = eval(['[',blocksperimg{1},']']);
yaml.elements = str2double(elements);
yaml.scale = str2double(scale);
yaml.width = str2double(width);
yaml.height = str2double(height);
features = regexpi(str,'Features[0-9]*:[\r\n \-0-9.e]*','match');
featList = cell(1,1);
for i = 1:numel(features)
featNum = str2double(regexp(features{i},'Features([0-9]*)','tokens','once'));
parts = regexpi(features{1},':','split');
featVals = eval(['[',regexprep(strtrim(parts{2}),'\r\n',','),']']);
featList{featNum} = featVals;
end
yaml.featList = featList;
end
它不会处理保存你提到的多个级别和比例,但是你可以修改代码来自己做,不应该太难。
我无法保证60MB文件的运行速度,但我想它应该比5分钟更快。
<强>更新强>
删除了“----------------”字符上不必要的拆分。