2017-01-11 2 views
3

사용자/아티스트/재생 수 데이터 세트를로드하고 내가 좋아할만한 아티스트를 예측하는 Python 스크립트를 작성했습니다. 그러나 데이터베이스 (다운로드 한 .tsv 파일)는 크기 때문에 읽고 원하는 정보를 사전에 저장하는 데 시간이 걸립니다. 이것을 어떻게 최적화 할 수 있습니까? 로드 된 데이터베이스를 보존 할 수있는 방법이있어서 예측을하고 싶을 때마다 다시로드 할 필요가 없습니다.스크립트가 실행될 때마다 데이터베이스로드를 피하십시오.

대단히 감사합니다.

+1

실제 데이터베이스를 사용하십시오. 한 번에 모든 것을 기억하려고하지는 않습니다. 'sqlite'는 매우 간단합니다. 또 다른 옵션은 db가로드 된 데몬 프로세스가 항상 실행되도록하는 것입니다. IPC (파이프, 소켓 등)를 통해 통신합니다. –

+0

이 솔루션은 매우 편리합니다. http://stackoverflow.com/a/6687707/6027071 – Alejandro

답변

2

shelve module을 사용하여 사전을 저장하고로드 할 수 있습니다. 알고리즘을 복잡하게 만들거나 사전이 작 으면 사전을 만드는 데 걸리는 처리 시간이 메모리에로드하는 데 걸리는 시간에 비하면 큰 편입니다.

사전이 여전히 커질 경우 사용할 수있는 트릭은 파일 포인터 오프셋을 사전 값으로 저장하는 것입니다. 즉 사전 값을 노래에 대한 정보 (예 :)로 사용하려면 정보 자체를 사전에 저장하는 대신 TSV 파일에 해당 줄이 시작되는 바이트 오프셋을 저장하십시오. 그런 다음 해당 정보에 액세스하려면 TSV 파일을 열고 오프셋을 찾아 라인을 읽고 파싱하여 해당 노래를 나타내는 객체를 구성합니다. 검색은 전체 파일을 읽는 것보다 빠르거나 적어도 훨씬 빠릅니다. 또는 mmap module을 사용하여 파일을 메모리 맵핑하고이를 효과적으로 바이트 배열로 처리 할 수 ​​있습니다. 이는 필요한 바이트 수 (또는 최소한 상한선이 적음)가 많은 경우 특히 유용합니다.

다른 프로그래밍 언어로 작성된 다른 시스템과의 호환성을 유지하려는 경우 또는 사람이 읽을 수있는 것을 원할 경우 json module을 사용하여 사전을 JSON으로 저장할 수 있습니다. 사전이 너무 크지 않은 경우에만이 방법을 권합니다.

당신이 시도 할 수있는 또 다른 해결책은 데이터베이스의 사전에 정보를 저장하는 것입니다. 데이터베이스는 빠르게 액세스 할 수 있도록 구성되어 있습니다. Python의 표준 라이브러리에는 sqlite3 module이 포함되어있어 SQLite 데이터베이스에 액세스 할 수 있습니다. 괜찮을거야. 그러나 이미 데이터베이스 서버를 실행 중이거나 별도의 데이터베이스 서버를 사용하여 여러 프로세스가 동시에 데이터베이스에 액세스하는 것과 같은 특별한 요구 사항이있는 경우 SQLAlchemy을 사용하여 모든 SQL 데이터베이스에 데이터를 저장하고로드 할 수 있습니다.

완성을 위해 나는 모든 파이썬 객체를 저장하는 데 사용할 수있는 pickle module을 언급 하겠지만 직접 사용하지 않아도된다고 생각합니다. 사전 형식 데이터를 저장하고로드하는 더욱 효율적인 방법이 있습니다.

관련 문제