【问题标题】:Python/YAML returns MemoryErrorPython/YAML 返回 MemoryError
【发布时间】:2016-11-04 12:08:04
【问题描述】:

我正在尝试使用 PyYAML 模块加载 YAML 文件,但是,我收到了 MemoryError。 文件大小似乎合理,即 28 MB。我过去加载了较大的文件,没有任何问题。我正在使用 Python27 32 位。有谁知道发生了什么,也许他们可以提出一个解决方案(我不想走分割 yaml 文件的道路)。

以下是我得到的错误:

>> yaml_results_file = yaml.load(open
(parent_folder+yaml_results_file_path+yaml_results_file_name, "r"))

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    yaml_results_file = yaml.load(open(parent_folder+yaml_results_file_path+yaml_results_file_name, "r"))
  File "C:\Python27\lib\site-packages\yaml\__init__.py", line 71, in load
    return loader.get_single_data()
  File "C:\Python27\lib\site-packages\yaml\constructor.py", line 39, in get_single_data
    return self.construct_document(node)
  File "C:\Python27\lib\site-packages\yaml\constructor.py", line 48, in construct_document
    for dummy in generator:
  File "C:\Python27\lib\site-packages\yaml\constructor.py", line 398, in construct_yaml_map
    value = self.construct_mapping(node)
  File "C:\Python27\lib\site-packages\yaml\constructor.py", line 208, in construct_mapping
    return BaseConstructor.construct_mapping(self, node, deep=deep)
  File "C:\Python27\lib\site-packages\yaml\constructor.py", line 127, in construct_mapping
    key = self.construct_object(key_node, deep=deep)
  File "C:\Python27\lib\site-packages\yaml\constructor.py", line 99, in construct_object
    self.constructed_objects[node] = data
MemoryError

【问题讨论】:

  • 这是在 Windows 上吗?你试过SafeLoader,CLoader吗? YAML 文件在某处可用吗?如果不是 1) 它有锚点和别名吗? 2) 是否有类型标签(如果没有,为什么不使用安全加载)?
  • 这是在 Windows 上。作为 Python 项目的一部分,我需要从 YAML 文件中读取数据。
  • 顺便说一句,我切换到 64 位 Python 并解决了问题,但我仍然不明白为什么会出现 MemoryError!可能是因为 YAML 文件中键的大小?
  • 文件大小可以,加载数据的时候开销很大。

标签: python python-2.7 memory yaml pyyaml


【解决方案1】:

python YAML 模块以using excessive amounts of memory 闻名,文件大小是文件大小的一百多倍。在您的情况下,一个 28 MB 的文件可能需要 3 GB 到 9 GB 的内存。

一个 32 位进程根本无法分配这么多内存(地址空间只有 4 GiB 大小,根据您的操作系统,内核可能会保留 1 GiB),因此模块最终会引发异常分配失败。

切换到 64 位会提高基于地址空间的限制,但不会降低实际内存需求。如果您预计解析更大的文件,您可能需要切换解析器或method of parsing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多