2014-02-13 3 views
0

그래서 파이썬 피클 파일에서 생성 된 데이터를로드하는 스크립트가 있습니다.Django orm을 통해 데이터로드 매우 메모리 집중

dump_file = open('movies.pkl') 
movie_data = pickle.load(dump_file) 

@transaction.commit_manually 
def load_data(data): 
    start = False 
    counter = 0 
    for item in data: 
       counter += 1 
      film_name = item.decode(encoding='latin1') 
      print "at", film_name, str(counter), str(len(data)) 
      film_rating = float(data[item][0]) 
      get_votes = int(data[item][2]['votes']) 
      full_date = data[item][2]['year'] 
      temp_film = Film(name=film_name,date=full_date,rating=film_rating, votes=get_votes) 
      temp_film.save() 
      for actor in data[item][1]: 
       actor = actor.decode(encoding='latin1') 
       print "adding", actor 
       person = Person.objects.get(full=actor) 
       temp_film.actors.add(person) 
      if counter % 10000 == 0 or counter % len(data) == 0: 
        transaction.commit() 
        print "COMMITED" 

load_data(movie_data) 

그래서 매우 큰 데이터 세트입니다. 그리고 크롤링 속도가 느려지는 곳에서 많은 메모리를 차지합니다. 과거에는 스크립트를 다시 시작하여 방금 전 데이터베이스에서 모든 것을 저장하는 데 꽤 많은 시간이 걸렸습니다.

데이터를 입력하기 위해 원시 sql을 쓰는 것 외에 다른 방법 (내 코드의 최적화도 좋을 것입니다)이 있는지 궁금합니다. 이전에 JSON 조명기를 사용해 보았는데이 방법보다 훨씬 나빴습니다.

답변

1

movie_data의 크기가 큰 경우 먼저 작은 파일로 나눈 다음 하나씩 반복 할 수 있습니다. 이전에로드 한 pkl 파일의 메모리를 비우거나 같은 변수를 덮어 쓰는 것을 잊지 마십시오. 동영상 데이터가 목록 인 경우 movie_data = movie_data [1000 :]와 같이 슬라이싱하여 반복적으로 처리 한 후 1000 개의 레코드로 메모리를 비울 경우

+0

movie_data는 각 동영상에 대한 정보 목록을 보유하고있는 사전이므로 여러 부분으로 사전을 분할하려고 할 수 있습니다. – dl8

+0

왜이 거대한 데이터 세트를 데이터베이스가 아닌 피클에 저장하는 특별한 이유가 있습니까? – lmc

+0

데이터를 얻는 방법의 특성상 모든 데이터를 피클에 모으고 모든 데이터를 처리하여 데이터베이스에 저장하는 것이 훨씬 편리합니다. 앞으로 데이터베이스에 직접로드하는 것을 작성하려고 시도 할 수도 있지만, 현재이 방법이 더 간단합니다. – dl8

1

bulk_create()를 사용할 수 있습니다. 메서드를 하나의 쿼리에 여러 객체를 생성하기 위해 QuerySet 객체에 추가하면 Django 1.4에서 사용할 수 있습니다. 다음 설명서 링크를 통해 이동하십시오 -

을 또한 파이썬에서 키워드 "와"열린 파일에 의해, 당신의 코드를 최적화 할 수 있습니다. "With"문은 자동으로 파일을 닫고 with 블록 안의 모든 작업을 수행하므로 파일을 열어두기 때문에 with 블록을 벗어난 파일은 닫힙니다.

+0

예,이 스크립트는 얼마 전 '함께'에 대해 몰랐을 때 만들어졌습니다. 지금 추가 할 것입니다. 도움이되는지 확인하기 위해 bulk_create를 테스트 할 것입니다. – dl8

+0

실제로, 더 많은 문서를 읽으면 "배우와 영화 모델에서 가지고있는"다 대 다 관계로 작동하지 않습니다. "라고되어 있습니다. – dl8

관련 문제