逐步创建 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 您的系统所基于的可用内容。
我面临以下问题:我创建了一个包含 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 您的系统所基于的可用内容。