1

API에서 얻은 사전 목록이 매우 많습니다. 다른 함수의 조회 테이블로 사용하고 싶습니다. 파이썬에는 여러 가지 객체 영속성 메소드가 있지만 쉽게 참조하고 조회 할 수 있도록 사전 목록을 디스크에 저장하는 것이 좋습니다.디스크의 검색 표로 구성된 사전 목록이 많습니다.

{ 
    "library_id": "7", 
    "set_id": "80344779", 
    "description": "Very long description 1 ...", 
    "value": "1" 
    }, 
    { 
    "library_id": "22", 
    "set_id": "80344779", 
    "description": "Very long description 2 ...", 
    "value": "1" 
    }, 
    { 
    "library_id": "24", 
    "set_id": "80344779", 
    "description": "Very long description 3 ...", 
    "value": "8" 
    }, 
+1

한 가지 가능한 대답 : MongoDB를에 저장 후 힌트로 pyMongo – emeth

+1

를 사용 : 저장하기 전에 숫자 값 (fe library_id)을 int로 변환하십시오. 이는 언급 된 지속성 솔루션에서 상당히 적은 공간을 필요로합니다. – dorvak

답변

1

데이터가 일정한 것 같습니다. 즉, 사전의 키가 변형되지 않았습니까? MongoDB와 같은 문서 기반 솔루션을 단순히 사용하는 경우도 있지만 단순한 SQL 기반 데이터베이스가 더 효율적이며 구현하기 쉽습니다.

피클 모듈 (실제 큰 개체는 메모리에로드 될 때 권장하지 않음)이거나 피클 상단에 빌드되는 shelve이지만 대용량 파일 인 afaik (이 파일은로드되지 않습니다. 한 번에 귀하의 기억에). shelve의 이점은 비단뱀 딕트 구문을 모방 한 구문이므로 사용이 쉬워야한다는 것입니다 (링크 참조). 그리고 MongoDB 또는 MySQL 데이터베이스를 설정할 필요가 없습니다 (적어도 Windows에서는 복잡 할 수 있습니다). 피클과 선반은 모두 표준 라이브러리의 일부입니다.

datasets도 확인할 수 있으며 사용하기 쉬운 인터페이스입니다. 그것은 후드 아래에서 sqlite-db를 사용합니다.

대용량 파일 (2GB를 초과한다고 가정)을 다루는 경우 sqlalchemy (+ MySQL-DB) 또는 MongoDB와 같은 성숙한 soultions를 사용하고 Python 인터페이스를 사용합니다. PyMongo)

+0

감사합니다 dorvak! 나는이 프로젝트에 MongoDB + pyMongo를 사용할 것이다. – dust

2

한 방법은 사전에 필드와 일치하는 클래스를 (장고 모델 https://docs.djangoproject.com/en/dev/topics/db/models/ 사용) 모델을 작성하고 같은 객체의 각 딕셔너리를 저장할 수

뭔가 같은 :

from django.db import models 

class MyDict(models.model): 
    library_id = models.CharField(max_length=30) 
    set_id = models.CharField(max_length=30) 
    description = models.CharField(max_length=30) 

고유 한 라이브러리가 library_id로 조회하는 데 도움이되는 경우 "library_id"를 기본 키로 만들 수 있습니다.

Google App Engine의 ndb api를 동일한 목적으로 사용할 수도 있습니다. (Google App Engine에서 호스팅하는 경우). https://developers.google.com/appengine/docs/python/ndb/

+0

@Nitin Verma, 고맙습니다. 이것은 내가 알고있는 존재에 대해 접근하고있는 또 다른 방법입니다. 매우 빨리 시험할만한 가치가 있습니다. – dust

0

다른 답변에서 알 수 있듯이 패키지 데이터베이스 모델을 살펴 보는 것이 좋습니다. 이식성이 필요한 경우 파이썬을 사용하여 sqlite3 데이터베이스를 쉽게 만들 수 있습니다. 데이터를 가정하는 것은 최소한의 작업 예를의 모습, API를에서오고 위에 나열된처럼 단순히 사전 요소의 목록입니다

import sqlite3 

# Create a database in memory, in practice you would save to disk 
conn = sqlite3.connect(':memory:') 

# Read in the data [omitted for brevity] 

cmd_create_table=''' 
CREATE TABLE api_data (
set_id  INTEGER, 
library_id INTEGER, 
description STRING, 
value  INTEGER); 
CREATE INDEX idx_api ON api_data (library_id, set_id); 
''' 
conn.executescript(cmd_create_table) 

cmd_insert = '''INSERT INTO api_data VALUES (?,?,?,?)''' 
keys = ["set_id","library_id","description","value"] 

for item in data: 
    val = [item[k] for k in keys] 
    conn.execute(cmd_insert, val) 

def lookup(library_id, set_id): 
    cmd_find = 'SELECT * FROM api_data WHERE library_id={} AND set_id={}' 
    cmd = cmd_find.format(library_id, set_id) 
    return conn.execute(cmd).fetchall() 

print lookup(22, 80344779) 

>>> [(80344779, 22, u'Very long description 2 ...', 1)] 
+0

질문을 게시 한 후에 이미 MongoDB에서이 기능을 구현하기 시작 했음에도 불구하고 이것은 매우 우아한 해결책처럼 보입니다. 나는 이것을 SQL 테이블로 구현하는 것이 더 번거로울 것이라고 생각했다. 이 샘플 코드를 제공해 주셔서 감사합니다. 앞으로의 프로젝트에서 시험해 볼 가치가 있습니다. – dust

+0

@dust mySQL은 때때로 설정하기 까다로울 수 있지만 sqlite는 매우 쉽고 다른 프로그램에 매우 유용합니다. – Hooked