메신저나 가계부 같은 앱이 만든 .db 파일이 무거워져서 오래된 기록을 한 번에 지웠다고 해 보겠습니다. 그런데 파일 속성을 다시 열어 보면 크기가 조금도 변하지 않았습니다.
삭제가 실패한 것은 아닙니다. SQLite는 파일을 고정 크기 페이지로 잘라 쓰고, 삭제는 그 페이지의 내용만 비울 뿐 페이지 자체를 파일에서 떼어내지 않습니다. 같은 파일 하나를 단계마다 다시 재고 안쪽 페이지 상태까지 읽어 확인했습니다.

세 번을 재는 동안 숫자가 하나도 안 움직였습니다
주문 기록 3만 행을 넣은 db 파일로 시작했습니다. 이 파일은 3,014,656바이트이고, 4,096바이트짜리 페이지 736장으로 이루어져 있습니다.
| 단계 | 남은 행 | 파일 크기 | 빈 페이지 |
|---|---|---|---|
| 3만 행 넣고 저장 | 30,000 | 3,014,656 B | 0장 |
| 2만 7천 행 삭제 | 3,000 | 3,014,656 B | 660장 |
| 지운 자리에 다시 넣기 | 30,000 | 3,014,656 B | 0장 |
| 다시 지우고 VACUUM | 3,000 | 311,296 B | 0장 |
90%를 지웠는데 크기가 1바이트도 안 변했습니다. 대신 빈 페이지가 660장 생겼습니다. 지운 자리가 파일 안에 빈칸으로 남아 있다는 뜻입니다.
그 빈칸은 버려지는 것이 아닙니다
표의 세 번째 줄이 이 구조의 핵심입니다. 지운 자리에 새 기록 2만 7천 건을 다시 넣었더니, 파일은 여전히 3,014,656바이트였고 빈 페이지 수는 660장에서 0장으로 돌아갔습니다.
새 공간을 요구하지 않고 비어 있던 페이지를 그대로 재활용한 것입니다. 앱이 기록을 계속 쌓고 지우기를 반복하는 동안 파일이 무한정 커지지 않는 이유가 여기에 있습니다. 파일 크기는 그 앱이 지금까지 한 번에 가장 많이 담았던 양을 기억하는 눈금에 가깝습니다.
정말 줄이고 싶을 때 쓰는 한 줄
빈칸을 실제로 걷어내려면 파일을 처음부터 다시 쓰라고 지시해야 합니다. VACUUM이 그 명령입니다. 아래는 파일 상태를 먼저 확인하고 정리까지 하는 코드입니다.
import os, sqlite3
db = r"C:\경로\app.db"
con = sqlite3.connect(db)
size = os.path.getsize(db)
free = con.execute("PRAGMA freelist_count").fetchone()[0]
page = con.execute("PRAGMA page_size").fetchone()[0]
print(f"{size:,} 바이트 중 빈칸 {free * page:,} 바이트")
con.execute("VACUUM")
con.close()
print(f"정리 후 {os.path.getsize(db):,} 바이트")
빈 페이지 수에 페이지 크기를 곱하면 되찾을 수 있는 양이 바로 나옵니다. 위 실측에서는 660장 곱하기 4,096바이트로 2,703,360바이트였고, VACUUM 뒤 실제로 그만큼이 사라졌습니다.
어떤 파일이 여기에 해당하나
확장자가 .db 나 .sqlite 인 파일이 대개 이 구조입니다. 메모장 앱, 가계부, 메신저, 브라우저가 기록을 담아 두는 파일이 흔히 여기에 속합니다. 이름은 제각각이라 확장자만으로 단정하기는 어렵고, 앞에서 쓴 코드가 오류 없이 열린다면 SQLite 파일이 맞습니다.
파일 옆에 같은 이름의 -wal 이나 -shm 파일이 함께 보인다면 그 앱이 지금 이 db 를 쓰고 있다는 뜻입니다. 그 상태에서 정리를 시도하면 잠겨 있다는 오류가 납니다. 앱을 완전히 닫은 뒤에 해야 합니다.
주의할 점 하나
VACUUM은 임시로 같은 크기의 파일을 하나 더 만들었다가 바꿔치우는 방식입니다. 디스크에 원본만큼의 여유가 없으면 실패하고, 실행 중에는 그 db를 쓰는 앱을 닫아 두어야 합니다. 앱이 쓰고 있는 파일을 다루기 전에 db 파일 안을 먼저 들여다보는 방법으로 무엇이 들었는지 확인해 두면 안전합니다. CSV를 db로 옮겨 쓰는 경우라면 SQLite에 불러와 조회하는 쪽이 함께 참고가 됩니다.
파일 크기가 안 줄었다고 삭제를 다시 누를 필요는 없습니다. 지워진 것은 지워졌고, 남은 것은 빈칸을 언제 걷어낼지 정하는 일뿐입니다.
위 크기와 페이지 수는 윈도우 11에서 파이썬 3.14.6의 표준 라이브러리 sqlite3 3.50.4로 db 파일 하나를 만들어 단계마다 다시 잰 값입니다. 페이지 크기는 기본값 4,096바이트였고, 행 개수와 문자열 길이가 다르면 절대 크기는 달라집니다.
'파일 형식 백과사전' 카테고리의 다른 글
| 인쇄소에 보낸 PDF에서 글꼴이 바뀌어 왔을 때, 보내기 전에 확인하는 법 (0) | 2026.09.26 |
|---|---|
| PDF를 돌려서 저장했는데 인쇄하면 다시 누워 나오는 이유 (0) | 2026.09.26 |
| PDF로 바꿔 보내면 이름은 안 따라갈까, 문서 정보를 직접 열어 확인했습니다 (1) | 2026.09.26 |
| JSON 파일이 커서 안 열릴 때, 통째로 읽지 않고 훑어보는 법 (0) | 2026.09.26 |
| 사진을 열었다 저장할 때마다 나빠진다는 말, 어디까지 사실일까 (0) | 2026.09.25 |