替代文件写作和阅读

时间:2015-08-13 13:56:19

标签: matlab opencv file-io yaml

对于我的项目,我必须使用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

1 个答案:

答案 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分钟更快。

<强>更新

删除了“----------------”字符上不必要的拆分。