我正在考虑将 SQLite 数据库用于处理大量数据系列的 C# 应用程序。数据目前位于多个 CSV 文件中,每个文件的大小最大为 20GB,格式如下:
2019.07.31 00:00:03.855,1.11568,1.11571,3,0
在迁移到 SQLite 时,我希望大大减小大小,但由于某种原因,我得到了一些不同的结果。
CSV 格式的示例字符串占用 44 个字节(43 个字符 + 新行)。据我了解的 SQLite 类型定义在 sqlite.org 中数据库中应该大致相同:23 字节日期时间文本 + 8*2 实数 + 1*2 整数 = 41 字节
dateTime 可以存储为 8 字节整数 (c# DateTime.Ticks),这应该将大小减少到每行约 26 个字节,几乎比 CSV 格式少两倍。
对于一个实验,我尝试导入 142,157 行数据。CSV 文件大小约为 6kk 字节,但生成的 DB 文件约为 5kk,几乎相同。压缩(在 DB Browser for SQLite 中可用)不会改变任何东西。
表架构是:
CREATE TABLE "Data" ( "dateTime" INTEGER, "value1" REAL, "value2" REAL, "value3" INTEGER, "value4" INTEGER )
示例行如下所示:
637001280038550000 1.11568 1.11571 3 …
我在进行聚类时遇到计算机崩溃。计算机恢复后临时文件尚未清除。现在如何安全地清除它们?
更新
Windows 操作系统。pgsql_tmp 目录为空,但磁盘空间仍然被位于表基文件夹中的集群临时文件占用。
我有一个带有 id 和集群的 PostgreSQL 表,如下所示:
CREATE TABLE w (id bigint, clst int);
INSERT INTO w (id,clst)
VALUES
(1,0),
(1,4),
(2,1),
(2,2),
(2,3),
(3,2),
(4,2),
(5,4),
(6,5);
Run Code Online (Sandbox Code Playgroud)
如果聚合按 id 分组的集群,您可以看到集群数组中存在重叠值:
select id, array_agg(clst) clst from w group by id order by id;
id | clst
----+---------
1 | {0,4}
2 | {1,2,3}
3 | {2}
4 | {2}
5 | {4}
6 | {5}
Run Code Online (Sandbox Code Playgroud)
即集群4覆盖id 1和5,集群2覆盖id 2、3和4,而集群5只对应一个id。
我现在如何聚合按集群数组重叠分组的 id?即预期的结果是:
id | clst
---------+-------
{1,5} | {0,4,4}
{2,3,4} | {1,2,3,2,2}
{6} | …
Run Code Online (Sandbox Code Playgroud)