逐步创建 YAML 文件

Stepwise creation of a YAML file

我面临以下问题:我创建了一个包含 python 个对象的大数据集(几个 10GB)。我想创建一个 YAML 格式的输出文件,其中包含每个对象的条目,其中包含有关保存为嵌套字​​典的对象的信息。但是,我从不将所有数据同时保存在内存中。

输出数据应存储在字典中,将对象名称映射到保存的值。一个简单的版本看起来像这样:

object_1: 
  value_1: 42
  value_2: 23

object_2:
  value_1: 17
  value_2: 13

[...]

object_a_lot:
  value_1: 47
  value_2: 11

为了保持低内存占用,我想为每个对象写入条目并在写入后立即删除它。我目前的做法是:

from yaml import dump

[...] # initialize huge_object_list. Here it is still small
with open("output.yaml", "w") as yaml_file:
    for my_object in huge_object_list:
        my_object.compute()  # this blows up the size of the object

        # create a single entry for the top level dict
        object_entry = dump(
            {my_object.name: my_object.get_yaml_data()}, 
            default_flow_style=False,
        )
        yaml_file.write(object_entry)

        my_object.delete_big_stuff()  # delete the memory consuming stuff in the object, keep other information which is needed later

基本上我在写几本字典,但每本只有一个键,而且由于对象名称是唯一的,所以不会崩溃。这行得通,但感觉 有点 的黑客攻击,我想问问是否有人知道更好/正确地做到这一点的方法。

有没有办法将大字典写入 YAML 文件,一次一个条目?

如果你想分阶段写出一个YAML文件,你可以按照你描述的方式来做。

如果不能保证您的键是唯一的,那么我建议使用序列(即列出 top-level(即使有一个项目),而不是映射。

这并没有解决 re-reading 文件的问题,因为 PyYAML 会尝试读取整个文件,并且不会快速加载,请记住 PyYAML 的内存开销会加载文件的要求很容易超过文件大小的 100 倍(一百倍)。我的 ruamel.yaml 对内存来说更好一些,但仍然需要内存中文件大小的几十倍。

您当然可以根据 "leading" 空格分割文件,可以通过不同的方式轻松找到新键(或者如果您使用序列,则为项目的破折号)。您还可以查看将每个 key-value 对存储在一个文件中其自己的文档中,如果您自己组合单个文档的 key-value 对,这会大大减少加载期间的开销。

在类似的情况下,我将单独的 YAML "objects" 存储在不同的文件中,使用文件名作为 "object" 值的键。这需要一些有效的文件系统(例如尾部打包),并且取决于基于 OS 您的系统所基于的可用内容。