【问题标题】:Alternative file writing and reading替代文件写入和读取
【发布时间】:2015-08-14 20:28:47
【问题描述】:

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

【问题讨论】:

  • 您特别需要文件中的哪些信息?如果您可以缩小范围,您可以进行一些可能会更快的手动解析。
  • 如果你想要一个完整的数据结构,就像你目前从yamlmatlab 得到的那样,你实际上是在要求某人为你编写一个解析器(或重写链接工具),这这不是一项微不足道的任务,似乎有点超出了本网站的范围。
  • 10 000 个 60 MB 的文件......这就是你所拥有的数据。您的整体任务似乎很繁重,也许可以尝试询问您已经尝试过的部分代码。
  • 我需要读取Features1、Features2、Features3、Features4等,Level1、Level2、Level3、Level4等,Scale1、Scale2、Scale3、Scale4等,Elements1、Elements2、 Elements3、Elements4 等,blocksperimg1、blocksperimg2、blocksperimg3、blocksperimg4 等和blockhistsize,@MZimmerman6
  • 我正在写一个你可以做的事情的例子,但我实际上无法读取你的示例文件(保管箱被阻止)所以我必须完全脱离你的例子。我只打算让你以此为基础,然后用它做更多的事情。希望你理解正则表达式:)

标签: matlab opencv file-io yaml


【解决方案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 分钟。

更新

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

【讨论】:

  • 让我试试。如果我对这种方法有任何问题,我可以回复您吗? @Mzimmerman6
  • 我今天会进进出出,但可以肯定
  • 它现在可以工作,但我有 13 个级别,例如 Features1、Features2...Features13。我不确定如何访问 Features9 以上的内容。
  • 哦,对不起,是的,我应该设置正则表达式来接受它。基本上任何你看到“[0-9]”的地方都变成“0-9]*”星号意味着你可以有多个数字。我已经更新了我的代码以反映这一点。
  • 老实说,您可能不会真正更快地获得它。仅仅因为您要解析 60MB 的文本,这是非常大的,诚然,正则表达式并不是世界上最快的东西。此外,您使用的是 MATLAB,您不能期望像这样的文本解析速度会很快。如果您真的想提高速度,请使用编译语言进行解析和分析。但即便如此,这仍然是一项艰巨的任务
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 2015-09-17
  • 2012-03-04
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多