2017-01-16 1 views
1

나는 다음과 같은 문제에 직면하고있다 : 나는 큰 데이터 세트 (몇 10GB)를 만들었다. 중첩 된 사전으로 저장된 개체에 대한 정보가 들어있는 각 개체에 대한 항목을 포함하는 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의 메모리 오버 헤드가 파일을로드하는 데 100x 이상이 될 수 있다는 것을 명심하십시오. 내 ruamel.yaml은 다소 메모리가 좋지만 메모리의 파일 크기가 수십 배 가량 필요합니다.

"leading"공백을 기반으로 파일을자를 수 있습니다. 새 키 (또는 시퀀스를 사용하는 경우 항목)을 다른 방식으로 쉽게 찾을 수 있습니다. 하나의 파일에 각 문서의 키 - 값 쌍을 저장하는 방법을 살펴볼 수도 있습니다. 이렇게하면 단일 문서의 키 - 값 쌍을 직접 결합하면로드하는 동안의 오버 헤드가 크게 줄어 듭니다.

유사한 상황에서 다른 파일에 개별 YAML "개체"를 저장하고 파일 이름을 "개체"값의 키로 사용했습니다. 이를 위해서는 효율적인 파일 시스템 (예 : 테일 패킹)이 필요하며 시스템이 기반으로하는 OS에 기반하여 사용 가능한 파일 시스템에 따라 다릅니다.

+0

입력 해 주셔서 감사합니다. 매우 도움이되었습니다. 나는 메모리 오버 헤드 문제를 인식하지 못했다. 이것이 내 데이터에 문제가되는지 확인하겠습니다. – m00am

관련 문제