2014-11-13 2 views
1

하나의 파이썬 인터프리터에서 동일한 객체 인스턴스의 양을 줄이려고합니다.django에서 기존 객체 재사용 ORM

예 : 우리는 천 개 블로그를 반복하는 경우

class Blog(models.Model): 
    author=models.ForeignKey(User) 

, 같은 (동일한 ID하지만 서로 다른 파이썬 객체) 저자 객체가 생성 얻을 여러 번.

장고 ORM이 이미 생성 된 사용자 인스턴스를 재사용 할 수있는 방법이 있습니까?

예 :

for blog in Blog.objects.all(): 
    print (blog.author.username) 

저자 "foo는-작가가"100 개 블로그가있는 경우, 메모리 (100) 저자 객체가 있습니다. 그것이 우리가 피하고 싶은 것입니다.

저는 mem-cached/redis와 같은 솔루션이 여기 도움이되지 않을 것이라고 생각합니다. 왜냐하면 우리는 파이썬 프로세스를 최적화하기를 원하기 때문입니다.

+0

1) https://docs.djangoproject.com/en/dev/topics/db/queries/#caching-and-querysets 2) https://github.com/Suor/django-cacheops – madzohan

답변

1

여기 데이터베이스 호출이나 메모리 사용에 대해 확신이 서지 않습니다.

(가) 전, 후 select_related을 사용하는 것이 도움이 될 것입니다 경우 모든 블로그와 관련 저자를 얻을 것이다

Blog.objects.all().select_related('author') 

.

blogs = Blog.objects.all() 
author_ids = set(b.author_id for b in blogs) 
authors = Author.objects.in_bulk(list(author_ids)) 
for blog in blogs: 
    blog._author = authors[blog.author_id] 
:

메모리를 최적화하려면

후 할 수있는 가장 좋은 방법은, 관련 저자는 한 번에 개체를 수동으로 얻을 딕셔너리에 저장 한 후 수동으로 각 블로그에 그 객체를 주석하는 것입니다
+0

감사합니다. 귀하의 회신. 우려 사항은 메모리와 관련이 없지만 런타임과 관련이 있습니다. 두 제안 모두 그것을 줄이는 데 도움이됩니다. 모델이 pk를 통해 관련 인스턴스의 캐싱을 켜는 구성 메타 옵션이 있습니까? 그것은 우리에게 더 깨끗해 보입니다. 그리고 관련된 모든 관련 분야에 대해 이러한 단계를 반복해서 반복하는 것보다 더 일반적 일 것입니다. – tbz

+0

우리는 이미 생성 된 파이썬 객체를 재사용하는 것이 (예 : 'select_related'와 같이) 재 작성하는 것보다 더 효율적이라는 추정을 뒷받침하는 몇 가지 테스트를 실시했습니다. – tbz