连接Kaggle加州交通事故数据表时遇'database or disk is full'错误的解决方法
问题描述
使用加州交通事故数据集,尝试通过case_id关联parties表与collisions表,仅筛选collision_date ≥ "2020-01-01"的行,执行以下代码:
import sqlite3 import pandas as pd con = sqlite3.connect("../switrs.sqlite") df_sqllite = pd.read_sql_query('SELECT * FROM parties JOIN collisions USING (case_id) WHERE collision_date >= "2020-01-01"', con)
出现错误:
DatabaseError: Execution failed on sql 'SELECT * FROM parties JOIN collisions USING (case_id) WHERE collision_date >= "2020-01-01"': database or disk is full
解决办法
- 检查并释放磁盘空间:用
df -h(Linux/macOS)或Windows资源管理器查看磁盘剩余空间,SQLite执行JOIN操作时会生成临时文件,需要足够磁盘空间支撑。删除磁盘上的冗余文件(如旧数据集、缓存文件)释放空间。 - *避免SELECT ,只查询所需字段:
SELECT *会返回所有列,大幅增加数据量。明确指定需要的字段,减少内存和磁盘占用,示例SQL:SELECT parties.case_id, collisions.collision_date, parties.party_age, parties.party_sex FROM parties JOIN collisions USING (case_id) WHERE collision_date >= "2020-01-01" - 分批读取数据:利用pandas的
chunksize参数分批加载数据,避免一次性读取过大数据集,示例代码:df_chunks = pd.read_sql_query( 'SELECT parties.case_id, collisions.collision_date FROM parties JOIN collisions USING (case_id) WHERE collision_date >= "2020-01-01"', con, chunksize=10000 ) # 遍历处理每个数据块 for chunk in df_chunks: # 此处添加数据处理逻辑 print(chunk.head()) - 给筛选字段添加索引:在SQLite中给
collisions表的collision_date字段创建索引,加快筛选效率,减少临时文件生成:
执行完索引创建后再运行查询语句。CREATE INDEX idx_collision_date ON collisions(collision_date);
内容的提问来源于stack exchange,提问作者Jean-Paul Azzopardi
相关产品推荐
相关产品推荐

