2011-01-07 3 views
0

파이썬에서 수치 시뮬레이션을 수행하여 상당히 큰 데이터 객체 (약 200MB)를 만듭니다. 나는 그것들을 sqlite3 db에 쓴다. 증가 해상도 (따라서 데이터 크기) 약 20 %로 DB에 삽입하는 동안 메모리 오류가 발생합니다. 전에 작은 해상도로 잘 작동했습니다. 내가 winxp를 1GB의 RAM에서하고 있어요파이썬은 sqlite3에 큰 요소를 삽입합니다. db - 메모리 오류

def write_to_db(self, filename, dataObject, name) : 
    connection = sqlite.connect(filename) 
    cursor  = connection.cursor() 
    cursor.execute("CREATE TABLE pulses (ID INTEGER PRIMARY KEY, name STRING, data BLOB)") 
    cursor.execute("INSERT INTO pulses(name, data) VALUES (?, ?)", (dataObjectName, sqlite.Binary(pickle.dumps(dataObject)))) 
    connection.commit() 
    connection.close() 

, 3기가바이트 스왑 (그리고 그 스왑이 확장 될 필요가 창-통보받지 못했다), 파이썬 2.6 : 여기에 코드입니다.

미리 도움을 주셔서 감사합니다. 팀

+0

SQLite 및 대부분의 관계형 데이터베이스는 200MB 객체를 염두에두고 설계되지 않았습니다. 그것은 작동하더라도 그것은 끔찍한 데이터베이스 조각화를 일으킬 가능성이 높습니다. 당신이 일하는 데 잘못된 도구를 사용하고 있다고 말하고 싶습니다. –

+0

개체의 산세가 문제가되는 것 같습니다. 그러나 SQLite가 잘못된 선택이라면 아마도 다른 접근 방식을 시도해야합니다. 그러나 어느 것? – Tim

답변

1

XP는 스왑을 조금씩 증가시킬뿐입니다. 프로그램이 갑자기 더 많은 메모리를 사용하려하고 스왑이 충분하지 않으면 메모리 오류가 발생합니다.

SQLite는 최대 1GB 크기의 BLOB로 아주 잘 작동 할 것이고 일반적으로 2GB를 사용할 수 있습니다. 그러나 32 비트 프로세스에서 주소 공간이 부족합니다.

대용량 데이터를 파일에 저장 한 다음 파일 이름을 데이터베이스에 저장하는 것이 일반적으로 권장되지만 그 방법이 더 유용합니다.

다음을 수행하여 즉시 문제를 해결할 수 있습니다 :

  • 스위치를 64 비트를 사용하여. Microsoft는 Windows 7 패밀리 팩을 판매합니다.이 패밀리 팩에는 XP/Vista의 3 가지 인스턴스에 대해 150 달러 (스트리트 가격 $ 130)의 업그레이드가 포함되어 있으므로 여러 대의 컴퓨터를 업그레이드 할 수 있습니다. 이런 식으로 32 비트 XP에서 64 비트 Win 7로 전환 할 수 있습니다. 이 작업을 수행하면 RAM의 용량 등을 변경하지 않아도 즉시 문제가 해결됩니다.

  • pickle 호출에 -1을 추가하면 ascii 기본값 대신 바이너리를 사용하는 가장 최근의 pickle 프로토콜을 사용하도록 지시합니다 부호화. 결과적으로 데이터가 줄어 듭니다. 프로토콜 버전 및 파이썬 버전에서 지원되는 프로토콜에 대한 자세한 정보는 문서를 참조하십시오. (예를 들어 bz2.compress (pickle.dumps OBJ, -1)

여기에이 문제의 가장 큰 원인은 주소 공간이 부족 32 -

  • 은 또한 절인 데이터를 압축. bit 프로세스는 일반적으로 동시에 2GB의 데이터만을 처리 할 수 ​​있으며 다양한 실행 파일과 공유 라이브러리, 각 스레드의 스택, SQLite 캐시 등도 해당 공간에서 뺍니다. 데이터 항목 및 살아있을 때 del 및 gc.collect()를 사전에 처리하면 호출되는 동시 데이터의 양이 줄어 듭니다.

  • 0

    대체 저장 메커니즘에 대한 의견을 묻습니다. 저장하는 데이터가 사용 가능한 RAM의 1/5 인 경우 RAM을 다 사용하기 전에 데이터를 복사 할 수 없기 때문에 메모리를 매우 신중하게 관리해야한다고 말하고 싶습니다. 어쨌든 당신은 죽이는 공연이 될 것입니다. 잠재적으로 커질 것으로 예상되므로 BLOB를 사용하여 sqlite가 올바른 작업을 수행 할 수 있습니다.

    간단한 키/값 저장소로 sqlite를 사용하고있는 것처럼 보입니다. 플랫 파일 사용을 고려 했습니까? ATOMicity가 필요한 경우에도 sqlite 데이터베이스를 사용하여 플랫 파일 저장소의 어떤 파일이 유효한지 정의 할 수 있습니다.모든 플랫 파일을 깔끔하게 작성하고 DB에서 해당 삭제를 커밋 한 후에 만 ​​플랫 파일을 제거한 후에 만 ​​DB에 커밋하면 안전하게 수행 할 수 있습니다.

    이 작업을 수행하려면 dataObject을 파이썬의 파일 유형 객체로 serialize하는 메커니즘이 필요합니다. Pickle은 파일 형식 개체를 전달하면이 작업을 수행 할 수 있지만 여전히 비효율적이라고 생각됩니다.

    수치 시뮬레이션을 수행한다고 말하면됩니다. 너는 질색인지 알고 있니? numpy 배열은 산세보다 더 효율적일 tofile 함수를 지원하며 이미 사용하지 않는 경우 시뮬레이션에서 상당한 성능 향상을 얻을 수 있습니다.