2017-01-16 122 views
1

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

回答

1

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

如果你的钥匙不能保证是唯一的,那么我会建议使用一个序列(即列出的顶层(即使有一个项目),而不是一个映射。

这不会解决由于PyYAML会重新读取文件,因此会尝试将文件作为一个整体进行读取,并且不会很快加载,并且请记住,PyYAML加载文件所需的内存开销可能轻松超过100倍(a百倍)的文件大小,我的ruamel.yaml对内存稍微好一点,但仍然需要内存文件大小的几十倍。新钥匙(或破折号)在使用序列的情况下)可以很容易地以不同的方式找到。您还可以查看将每个键值对存储在其自己的文档中的一个文件中,如果您自己组合单个文档的键值对,则可以大大减少加载过程中的开销。

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

+0

感谢您的意见,这非常有帮助。我没有意识到内存开销问题。我会检查这是否会成为我数据的问题。 – m00am