[PYTHON] 온 - 디스크 데이터베이스와 빠른 인 - 메모리 데이터베이스 사이를왔다 갔다합니까?
PYTHON온 - 디스크 데이터베이스와 빠른 인 - 메모리 데이터베이스 사이를왔다 갔다합니까?
Python의 sqlite3 : memory : 옵션은 동등한 디스크상의 데이터베이스보다 빠른 쿼리와 업데이트를 제공합니다. 디스크 기반 데이터베이스를 메모리에로드하고 빠른 작업을 수행 한 다음 업데이트 된 버전을 디스크에 다시 쓰려면 어떻게합니까?
문제는 파이썬에서 메모리 sqlite 데이터베이스를 검색하는 방법과 관련되어 보이지만 인 - 메모리 db에서 디스크 기반 탐색 도구를 사용하는 방법에 중점을 둡니다. 질문 in-memory SQLite 데이터베이스를 Python의 다른 메모리 내 SQLite 데이터베이스에 복사하려면 어떻게해야합니까? 또한 관련되어 있지만 장고에만 해당됩니다.
현재의 솔루션은 디스크 기반 데이터베이스에서 튜플 목록으로 모든 테이블을 한 번에 읽은 다음 인 메모리 db에 대한 전체 데이터베이스 스키마를 수동으로 다시 작성한 후 데이터를로드합니다. 튜플 목록을 메모리 내 DB에 저장합니다. 데이터를 조작 한 후 프로세스가 취소됩니다.
더 좋은 방법이 있어야합니다!
해결법
-
==============================
1.파이썬 sqlite3에서 메모리에 기존 DB 파일을로드하는 방법에 대한 답변은 무엇입니까? 중요한 단서를 제공했습니다. 그 답을 바탕으로, 여기에 그 코드의 단순화와 일반화가 있습니다.
파이썬 sqlite3에서 메모리에 기존 DB 파일을로드하는 방법에 대한 답변은 무엇입니까? 중요한 단서를 제공했습니다. 그 답을 바탕으로, 여기에 그 코드의 단순화와 일반화가 있습니다.
StringIO의 불필요한 사용을 없애고 인 메모리 (in-memory) 데이터베이스에서 읽고 쓰는 데 사용할 수있는 재사용 가능한 형식으로 패키지됩니다.
import sqlite3 def copy_database(source_connection, dest_dbname=':memory:'): '''Return a connection to a new copy of an existing database. Raises an sqlite3.OperationalError if the destination already exists. ''' script = ''.join(source_connection.iterdump()) dest_conn = sqlite3.connect(dest_dbname) dest_conn.executescript(script) return dest_conn if __name__ == '__main__': from contextlib import closing with closing(sqlite3.connect('pepsearch.db')) as disk_db: mem_db = copy_database(disk_db) mem_db.execute('DELETE FROM documents WHERE uri="pep-3154"') mem_db.commit() copy_database(mem_db, 'changed.db').close()
-
==============================
2.솔직히 말해, 메모리 내 데이터베이스를 너무 많이 사용하지는 않을 것입니다. 사용 가능한 메모리 내에 항상 들어 맞는 인덱스 구조가 실제로 필요하지 않는 한 말입니다. SQLite는 입출력에 대해 매우 똑똑합니다. 특히 읽기 (read)를 포함한 모든 것을 트랜잭션으로 래핑 할 때 특히 그렇습니다. 근본적으로 외부 저장소에 저장되는 데이터 구조를 조작 할 때 매우 효율적으로 메모리에 항목을 보관하지만 메모리를 낭비하지는 않습니다. RAM은 실제로 데이터가 저장된 기본 위치가 아닌 "버퍼"로 더 잘 작동한다고 생각합니다. 특히 가상 저장소 환경에서는 모든 것이 "어쨌든 외부 저장소에 의해 지원되는"것으로 간주되어야합니다.
솔직히 말해, 메모리 내 데이터베이스를 너무 많이 사용하지는 않을 것입니다. 사용 가능한 메모리 내에 항상 들어 맞는 인덱스 구조가 실제로 필요하지 않는 한 말입니다. SQLite는 입출력에 대해 매우 똑똑합니다. 특히 읽기 (read)를 포함한 모든 것을 트랜잭션으로 래핑 할 때 특히 그렇습니다. 근본적으로 외부 저장소에 저장되는 데이터 구조를 조작 할 때 매우 효율적으로 메모리에 항목을 보관하지만 메모리를 낭비하지는 않습니다. RAM은 실제로 데이터가 저장된 기본 위치가 아닌 "버퍼"로 더 잘 작동한다고 생각합니다. 특히 가상 저장소 환경에서는 모든 것이 "어쨌든 외부 저장소에 의해 지원되는"것으로 간주되어야합니다.
from https://stackoverflow.com/questions/31191727/moving-back-and-forth-between-an-on-disk-database-and-a-fast-in-memory-database by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] delimiter word에 기반한리스트 분할하기 (0) | 2018.11.16 |
---|---|
[PYTHON] if와 break로 파이썬 목록 이해하기 (0) | 2018.11.16 |
[PYTHON] BeautifulSoup4가 숨어있는 곳은 어디입니까? (0) | 2018.11.16 |
[PYTHON] 어떻게하면 파이썬에서 여러 개의 빈 목록을 만들 수 있습니까? (0) | 2018.11.16 |
[PYTHON] 한 줄씩 파일을 한 줄씩 읽는 방법? (0) | 2018.11.16 |