我有一个文件夹,里面有150多个txt文件。
组合数据
结果文件的大小为320 MB。我创建了一个数据库并插入组合数据:
with open("resall.TXT", "r") as f:
result = f.readlines()
result = [x.split(",") for x in result]
import sqlite3 as sq3
con = sq3.connect("popular.db")
con.execute(
"""
CREATE TABLE IF NOT EXISTS popname (
id INTEGER PRIMARY KEY,
state TEXT,
sex TEXT,
year TEXT,
forename TEXT,
count INTEGER
);
"""
)
for i, (state, sex, year, forename, count) in enumerate(result):
con.execute(
"""
INSERT INTO popname VALUES (?, ?, ?, ?, ?, ?);
""",
(i, state, sex, year, forename, count.strip()),
)
con.commit()
我无法创建数据库,因为它太大了。如何缩小数据库的大小?
问题不是SQLite,而是导入脚本。SQLite可以轻松处理那么多数据,320 MB并没有那么大。
第一个问题是,您正在将所有320 MB的内存都拖入内存。相反,在行上迭代。
with open("resall.TXT", "r") as f:
for line in f:
rows = line.split(",")
// then insert
当您进行插入时,每次插入后提交都会使速度显著减慢。每次提交都会强制SQLite写入速度较慢的磁盘。
相反,每隔1000行左右提交一次
for i, (state, sex, year, forename, count) in enumerate(rows):
con.execute(
"""
INSERT INTO popname VALUES (?, ?, ?, ?, ?, ?);
""",
(i, state, sex, year, forename, count.strip()),
)
if i % 1000 == 0:
con.commit()
然而,有一种更快的方法可以做到这一点。使用SQLite自己的内置导入程序。
- 在文件中添加标题行,确保它们与列名匹配
- 在SQLite外壳中打开数据库
- 创建您的表
- 将CSV文件导入表:
.import /path/to/your/file.csv popname --csv