2011-03-27 5 views
2

500,000 개의 tinyint 값 (0 - 256 사이)이 포함 된 SQLite 파일을 만들고 싶습니다. 제 계산에 따르면,이 파일은 대략 5 [MB]를 사용해야합니다.SQLite - 5,000,000 개의 TINYINT 값을 가진 파일?

그러나 크기가 50MB에 가까워지고 있습니다.

import sqlite3 
# Create and populate a database 
db = sqlite3.connect('/home/mine/temp.db') 
db.execute("CREATE TABLE IF NOT EXISTS test(id INT2)") 
for i in range(0, 5000000): 
    db.execute("INSERT INTO test(id) VALUES({0})".format(0)) 
db.commit() 
db.close() 

어떤 아이디어가 훨씬 적은 공간을 차지하도록하는 방법 일을 최적화 할

여기 내가 사용하는 코드는?

+0

얼마나 많은 테이블/인덱스/많은 것들에 달려 있습니다. DB 생성을 시도 했습니까? – PostMan

+0

나는 거대한 파일을 가지고있다. 아마 SQLite에 익숙하지 않은 것 같습니다. 어떤 제안? (나는 단 하나의 테이블 만 필요하고 전혀 표시하지 않습니다) – user3262424

+1

거대한 크기는 얼마나됩니까? 6MB? 50MB? 테이블을 생성하는 데 사용한 코드를 게시하는 것이 좋습니다. 그런 다음 사람들은 최적화 방법에 대한 구체적인 제안을 할 수 있습니다. –

답변

6

5 백만 개의 작은 int를위한 공간보다 데이터베이스에 더 많은 것이 있습니다. SQLite는 details of their file format을 게시했습니다. 행당 9 바이트 이상이 필요할 것이라고합니다. 키에 대한 64 비트 정수 값을 사용

  • 테이블 B - 트리 :

    SQLite는 는 B- 트리 구조의 두 가지 변종을 이용한다. 테이블 B-Tree에는 연관된 데이터베이스 레코드 (섹션 2.3.2)이 각 항목 과 함께 저장됩니다. 표 B- 트리 구조 은 섹션에 자세히 설명되어 있습니다. 2.3.4.

  • 데이터베이스 레코드를 키로 사용하는 인덱스 B- 트리입니다. 인덱스 B 트리 구조는 섹션 2.3.3에 자세히 설명되어 있습니다.
+0

감사합니다.이 모든 것을 설명합니다. – user3262424

2

2 열 값/빈도 테이블을 사용해 보았습니까? 검색어가 좀 더 복잡해질 수 있습니다 (예 : AVG(Value) 대신 SUM(Value * Freq)/SUM(Freq)이 필요함).하지만 500 만 개가 아니라 256 개의 행이 필요합니다.

+0

이것이 어떻게 문제를 해결하는지 이해할 수 없습니다.이 방법으로 5 백만 행을 절약 할 수 있습니다. 설명 할 수 있니? – user3262424

+0

예를 들어, 숫자 42가 20000 번 발생하는 경우 (42)의 20000 행을 저장하지 마십시오. 한 행 (42, 20000)을 저장합니다. – dan04

+0

알겠습니다. 진실은 어떤 ID가 어떤 숫자인지를 알아야한다는 것입니다. 그래서 이런 종류의 압축은 나에게 효과가 없을 것입니다. – user3262424

관련 문제