2010-03-10 4 views
3

저는 약 15 개의 열 (주로 수레)이있는 500,000 개 이상의 행이있는 매우 큰 SQLite 테이블을 가지고 있습니다. SQLite DB에서 Django 응용 프로그램으로 데이터를 전송하고 싶습니다. (많은 RDBM에서 지원할 수 있지만 Postgres에서는 가능합니다.) 모든 것이 정상적으로 작동하지만 반복이 계속되면 메모리 사용량이 파이썬 프로세스에 대해 초당 2 ~ 3 메가 씩 증가합니다. 나는 'del'을 사용하여 각 반복 끝에 EVEMapDenormalize 및 행 개체를 삭제하려고 시도했지만 부풀기가 계속됩니다. 발췌입니다, 어떤 아이디어?Django + SQLite3를 사용한 메모리 사용

class Importer_mapDenormalize(SQLImporter): 
def run_importer(self, conn): 
    c = conn.cursor() 

    for row in c.execute('select * from mapDenormalize'): 
     mapdenorm, created = EVEMapDenormalize.objects.get_or_create(id=row['itemID']) 
     mapdenorm.x = row['x'] 
     mapdenorm.y = row['y'] 
     mapdenorm.z = row['z'] 

     if row['typeID']: 
      mapdenorm.type = EVEInventoryType.objects.get(id=row['typeID']) 

     if row['groupID']: 
      mapdenorm.group = EVEInventoryGroup.objects.get(id=row['groupID']) 

     if row['solarSystemID']: 
      mapdenorm.solar_system = EVESolarSystem.objects.get(id=row['solarSystemID']) 

     if row['constellationID']: 
      mapdenorm.constellation = EVEConstellation.objects.get(id=row['constellationID']) 

     if row['regionID']: 
      mapdenorm.region = EVERegion.objects.get(id=row['regionID']) 

     mapdenorm.save() 
    c.close() 

이 SQLite DB를 Django ORM으로 감싸는 데 관심이 없습니다. 난 정말 내 RAM을 모두 빠지게하지 않고 데이터를 전송하는 방법을 알아 내려고하고 싶습니다.

+0

데이터를 가져 오기 위해 왜 순차적 SQL 삽입 문을 사용하지 않습니까? 그렇지 않으면 특정 유형을 한 번만 찾도록 objects.get 호출 결과를 캐싱하여 성능을 향상시킬 수 있습니다. – Tom

+0

Django의 ORM을 사용하여 광범위한 데이터베이스 엔진에서 데이터 무결성을 보장하고자했습니다. 사용자는 장고가 지원하는 임의의 RDBM에 배포 할 수 있습니다. – Greg

+0

바보 같은 저기, 장고 FAQ에서 해결되었습니다 : http://docs.djangoproject.com/en/dev/faq/models/#why-is-django-leaking-memory DB 쿼리 캐시 지우기가 필요합니다. DEBUG 모드 일 때. django에서 가져 오기 db db.reset_queries() – Greg

답변

3

어리석은 일, 이것은 Django FAQ에서 처리되었습니다.

DEBUG 모드에서 DB 쿼리 캐시를 지우는 데 필요합니다.

from django import db 
db.reset_queries() 
+0

쿼리 캐시 + DEBUG = True가 이번에는 유용하지만, 향후 디버깅 및/또는 최적화 라운드에서 유용 할 수 있습니다. 쿼리는'django.db.connection.queries'에 캐시됩니다. – istruble

1

나는 select * from mapDenormalize라고 생각하고 결과를 메모리에로드하는 것은 항상 나쁜 생각입니다. 내 조언은 - 청크로 스크립트를 퍼뜨리는 것입니다. 부분적으로 데이터를 얻으려면 LIMIT을 사용하십시오.

첫 번째 부분을 가져 와서 커서를 닫은 다음 다음 부분을 가져옵니다.

+0

나는 처음에는 이것을 생각했지만, 여전히 메모리 누출로 이어졌다. 메모리 사용은 위에서 설명한 상황에서 변경되지 않습니다. – Greg