【问题标题】:read .yml files in matlab issue在 matlab 问题中读取 .yml 文件
【发布时间】:2023-03-29 21:14:01
【问题描述】:

对于我的项目,我想使用 YAMLMatlab 在 matlab 中读取 yml 文件。我的 .yml 文件看起来像这样。我必须展示 .yml 文件的一部分。我的文件大约 29 MB。

%YAML:1.0
Block size: [ 16, 16 ]
Block stride: [ 8, 8 ]
Cell size: [ 8, 8 ]
block hist size: 36
block per img: [ 63, 63 ]
Total elements in array: 142884
nbins: 9
Scale: 1.
Level: 0
Width: 512
Height: 512
features:
   - 1.5302167832851410e-01
   - 1.0552208870649338e-01
   - 1.6659785807132721e-01
   - 2.3539969325065613e-01
   - 2.0810306072235107e-01
   - 1.2627227604389191e-01
   - 8.0759152770042419e-02
   - 6.4930714666843414e-02
   - 6.1364557594060898e-02
   - 2.1614919602870941e-01
   - 1.4714729785919189e-01

读取 .yml 文件时出现以下错误。

Error using ReadYamlRaw>load_yaml (line 78)
Java exception occurred:
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at org.yaml.snakeyaml.reader.StreamReader.<init>(StreamReader.java:51)
    at org.yaml.snakeyaml.Yaml.load(Yaml.java:399)

Error in ReadYamlRaw (line 42)
    result = load_yaml(filename, nosuchfileaction, treatasdata);


Error in ReadYaml (line 48)
    ry = ReadYamlRaw(filename, 0, nosuchfileaction, treatasdata);


Error in untitled (line 2)
 YamlStruct = ReadYaml(yaml_file);

我相信这个错误是由于文件太大,因为我可以读取简单的 .yml 文件。有人可以帮我解决这个错误。我也读过这个post

P.S:Here 是 .yml 文件

编辑:
它适用于以下答案,但我现在收到以下错误。一旦我卸妆%YAML:1.0。它工作正常。

Error using ReadYamlRaw>load_yaml (line 78)
Java exception occurred:
while scanning a directive
 in "<string>", line 1, column 1:
    %YAML:1.0
    ^
expected alphabetic or numeric character, but found :(58)
 in "<string>", line 1, column 6:
    %YAML:1.0
         ^

    at org.yaml.snakeyaml.scanner.ScannerImpl.scanDirectiveName(ScannerImpl.java:1028)
    at org.yaml.snakeyaml.scanner.ScannerImpl.scanDirective(ScannerImpl.java:990)
    at org.yaml.snakeyaml.scanner.ScannerImpl.fetchDirective(ScannerImpl.java:534)
    at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:251)
    at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:179)
    at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:198)
    at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:161)
    at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:146)
    at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:105)
    at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:121)
    at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:480)
    at org.yaml.snakeyaml.Yaml.load(Yaml.java:399)

Error in ReadYamlRaw (line 42)
    result = load_yaml(filename, nosuchfileaction, treatasdata);


Error in ReadYaml (line 48)
    ry = ReadYamlRaw(filename, 0, nosuchfileaction, treatasdata);


Error in untitled (line 2)
 YamlStruct = ReadYaml(yaml_file);

【问题讨论】:

    标签: matlab file-io yaml


    【解决方案1】:

    在 MATLAB 中,从菜单/工具条中选择首选项。找到 MATLAB>General>Java Heap Memory 部分,并增加 Java 堆大小。

    更改此设置后,您需要重新启动 MATLAB 才能使其生效。

    【讨论】:

    • 它可以工作,但我遇到了新错误。我编辑了我的问题。 @山姆
    • 我不是 YAML 专家,但我相信它应该是 %YAML 1.0,而不是 %YAML:1.0。在那里放一个冒号会使 YAML 无效,我认为删除它应该可以解决问题(当然,在你尝试的时候去掉整行也应该这样做)。
    • 实际上它是在我在 OpenCV 中制作 yml 文件时自动生成的,我有大约 8000 个 yml 文件。所以我需要这样读。
    • 我查了一下,YAML 规范says 版本指令(和所有指令)必须用空格分隔。因此,如果 OpenCV 正在生成以冒号分隔的指令,我会接受它们。同时,YAMLMATLAB 使用 SnakeYaml Java 库对 YAML 进行实际读取,因此要更改识别(错误)冒号分隔指令的行为,您需要获取 Java 源代码,对其进行修改并重新构建库。在所有文件中查找和替换可能会更容易:(
    • 是的,我就是这么想的。谢谢!
    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2013-06-14
    • 2012-01-15
    • 2013-11-22
    相关资源
    最近更新 更多