gpt4 book ai didi

python - 逐步创建YAML文件

转载 作者:太空宇宙 更新时间:2023-11-03 15:46:49 25 4
gpt4 key购买 nike

我面临以下问题:我创建了一个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 文件,您可以按照您描述的方式进行。

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

这并不能解决重新读取文件的问题,因为 PyYAML 将尝试读取整个文件,并且不会快速加载,请记住,加载一个文件需要 PyYAML 的内存开销。文件大小很容易超过文件大小的 100 倍(一百倍)。我的 ruamel.yaml 更适合内存,但仍然需要内存中文件大小的几十倍。

您当然可以根据“前导”空格分割文件,可以通过不同的方式轻松找到新键(如果您使用序列,则为项目的破折号)。您还可以考虑将每个键值对存储在一个文件内其自己的文档中,如果您自己组合单个文档的键值对,这将大大减少加载期间的开销。

在类似的情况下,我将各个 YAML“对象”存储在不同的文件中,使用文件名作为“对象”值的键。这需要一些高效的文件系统(例如尾部打包),并且取决于您的系统所基于的操作系统可用的文件系统。

关于python - 逐步创建YAML文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41679511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com