2014-10-02 5 views
1

나는 세 개의 Python 클래스, Student, EventStudentEvent을 가지고 있습니다. 편의상서로를 참조하는 pickling 객체

:

class Student: 
    def __init__(self, id): 
     self.id = id 

class Event: 
    def __init__(self, id): 
     self.id = id 
     self.studentevents = [] 

class StudentEvent: 
    def __init__(self, student, event, id): 
     self.student = student 
     self.event = event 
     self.id = id 

내가 가진 내가 읽고 분석 할 수 있습니다 사전에 투입이 클래스의 각 인스턴스의 수천 수백만의 사이. 객체를 읽고 생성하는 데는 많은 시간이 걸리므로, 나는 그들을 3 개의 사전, students_dict, events_dict, studentevents_dict으로 피클 링하고 싶습니다.

그럼, 할 수 있습니다. 그러나 나중에 내가 사전을 풀어 버리면 studentevents_dict의 학생과 이벤트는 students_dictevents_dict에있는 StudentsEvents을 언급하지 않을 것입니다. 맞습니까? StudentEvent에 의해 참조되는 이벤트는 동일한 ID에 함께 Event을 수 없기 때문에 나는 Event 객체에 관련된 StudentEvents의 목록을 채우는 예를 들어, 나중에 개체를 수정할 경우

, 그 문제가 될 수있다 events_dict.

+0

, 당신은 SQLite는 같은 데이터베이스로 전환하는 것이 좋습니다. –

+0

그건 분명히 내가 제시 한 경우에 더 빠를 것이다. 그러나 위의 정의에서 각각의 객체에 대해 보존하고 싶은 클래스 메소드와 계산 및 기타 정크가 많이 숨겨져있다. 서로를 참조하는 피클 링. 그래도 좋은 제안! –

답변

2

수정. 객체 간의 포인터 관계를 유지해야하는 경우, 예를 들어 튜플에서 이들 객체를 함께 피클 링해야합니다. 여기서는 pickle 대신 dill을 사용하고 있지만 효과는 동일해야합니다. 이는 (그림과 같이) 클래스 인스턴스, dicts 또는 기타 경우에 적용됩니다.

>>> class A: 
... def __init__(self, b): 
...  self.b = b 
... 
>>> class B: 
... pass 
... 
>>> import dill 
>>>   
>>> b = B() 
>>> a = A(b) 
>>> 
>>> f = open('_sed', 'wb') 
>>> dill.dump(({1:a},{2:b}), f) 
>>> f.close() 

그리고 나중에 ... 그 크기의 데이터 세트에 대한

Python 2.7.8 (default, Jul 13 2014, 02:29:54) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import dill 
>>> f = open('_sed', 'rb') 
>>> t = dill.load(f) 
>>> f.close() 
>>> t 
({1: <__main__.A instance at 0x10906a440>}, {2: <__main__.B instance at 0x10906a830>}) 
>>> t[0][1].b 
<__main__.B instance at 0x10906a830> 
관련 문제