복붙노트

[PYTHON] 온 - 디스크 데이터베이스와 빠른 인 - 메모리 데이터베이스 사이를왔다 갔다합니까?

PYTHON

온 - 디스크 데이터베이스와 빠른 인 - 메모리 데이터베이스 사이를왔다 갔다합니까?

Python의 sqlite3 : memory : 옵션은 동등한 디스크상의 데이터베이스보다 빠른 쿼리와 업데이트를 제공합니다. 디스크 기반 데이터베이스를 메모리에로드하고 빠른 작업을 수행 한 다음 업데이트 된 버전을 디스크에 다시 쓰려면 어떻게합니까?

문제는 파이썬에서 메모리 sqlite 데이터베이스를 검색하는 방법과 관련되어 보이지만 인 - 메모리 db에서 디스크 기반 탐색 도구를 사용하는 방법에 중점을 둡니다. 질문 in-memory SQLite 데이터베이스를 Python의 다른 메모리 내 SQLite 데이터베이스에 복사하려면 어떻게해야합니까? 또한 관련되어 있지만 장고에만 해당됩니다.

현재의 솔루션은 디스크 기반 데이터베이스에서 튜플 목록으로 모든 테이블을 한 번에 읽은 다음 인 메모리 db에 대한 전체 데이터베이스 스키마를 수동으로 다시 작성한 후 데이터를로드합니다. 튜플 목록을 메모리 내 DB에 저장합니다. 데이터를 조작 한 후 프로세스가 취소됩니다.

더 좋은 방법이 있어야합니다!

해결법

  1. ==============================

    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. ==============================

    2.솔직히 말해, 메모리 내 데이터베이스를 너무 많이 사용하지는 않을 것입니다. 사용 가능한 메모리 내에 항상 들어 맞는 인덱스 구조가 실제로 필요하지 않는 한 말입니다. SQLite는 입출력에 대해 매우 똑똑합니다. 특히 읽기 (read)를 포함한 모든 것을 트랜잭션으로 래핑 할 때 특히 그렇습니다. 근본적으로 외부 저장소에 저장되는 데이터 구조를 조작 할 때 매우 효율적으로 메모리에 항목을 보관하지만 메모리를 낭비하지는 않습니다. RAM은 실제로 데이터가 저장된 기본 위치가 아닌 "버퍼"로 더 잘 작동한다고 생각합니다. 특히 가상 저장소 환경에서는 모든 것이 "어쨌든 외부 저장소에 의해 지원되는"것으로 간주되어야합니다.

    솔직히 말해, 메모리 내 데이터베이스를 너무 많이 사용하지는 않을 것입니다. 사용 가능한 메모리 내에 항상 들어 맞는 인덱스 구조가 실제로 필요하지 않는 한 말입니다. SQLite는 입출력에 대해 매우 똑똑합니다. 특히 읽기 (read)를 포함한 모든 것을 트랜잭션으로 래핑 할 때 특히 그렇습니다. 근본적으로 외부 저장소에 저장되는 데이터 구조를 조작 할 때 매우 효율적으로 메모리에 항목을 보관하지만 메모리를 낭비하지는 않습니다. RAM은 실제로 데이터가 저장된 기본 위치가 아닌 "버퍼"로 더 잘 작동한다고 생각합니다. 특히 가상 저장소 환경에서는 모든 것이 "어쨌든 외부 저장소에 의해 지원되는"것으로 간주되어야합니다.

  3. 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