我面临以下问题:我创建了一个大数据集(几个10GB)的python对象。我想创建一个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文件,一次一个条目?
答案 0 :(得分:1)
如果要分阶段写出YAML文件,可以按照描述的方式进行。
如果您的密钥不能保证唯一,那么我建议使用一个序列(即列出顶层(即使是一个项目),而不是映射。
这并没有解决重新读取文件的问题,因为PyYAML会尝试整个文件读取并且不会快速加载,请记住PyYAML的内存开销需要加载文件很容易超过文件大小的100倍(一百倍)。我的ruamel.yaml对内存有点好,但仍需要内存中文件大小的几十倍。
你当然可以根据"领先"来剪切文件。空格,新键(或使用序列时项目的短划线)可以通过不同的方式轻松找到。您还可以查看将每个键值对存储在一个文件中的自己的文档中,如果您自己组合单个文档的键值对,则可以大大减少加载过程中的开销。
在类似的情况下,我存储了单独的YAML"对象"在不同的文件中,使用文件名作为"对象"的键。值。这需要一些有效的文件系统(例如尾部打包),并取决于您的系统所基于的操作系统可用的内容。