我创建了一个SQLite数据库,其中从CSV文件导入了数十亿行(目前为1.1 TB)到数据库的各种表中。一个这样的表(X)包含超过50 GB的数据。我正在使用Jupyter Python(在我自己的conda环境中)来获取对该表查询的结果。该表具有基于time
列的各种年份的数据,因此我也可以使用条件(在where子句中)仅获取年度数据或每月数据。
使用创建表时使用的主键在此表上建立索引。
我正在使用熊猫查询数据库并获取结果:
pd.read_sql_query("select id, strftime(\"%Y-%m\", time) as month,
count(case value when '1' then 1 else null end) as values_count from X where time>= '2018-01-01' GROUP BY id, strftime(\"%Y-%m\", time);", conn)
在上面的查询中,我试图仅根据2018年的月份对所有ID进行分组(考虑到我没有未来几年的数据),并在它们等于1时计算值。
我一直遇到DatabaseError: database or disk is full
错误。
规格为:
我很确定我将能够使用可用的内存来解析并生成SQL输出(因为同一数据库上的另一个查询有效),但是我不确定Python是否使用内存或临时目录来产生结果。该查询还会在将近30分钟(使用几乎100%的CPU)之后终止。
我还研究了将chunksize
用作read_sql_query
,但似乎在查询成功执行后很有用。任何人都可以进一步阐明我如何进行这项工作吗?