我目前发现自己需要对数百万个数据点进行相当简单的计算。 (从定义良好的多千兆位文件构建一个大的字符串列表,对该列表进行排序,然后将其与另一个列表,一个超集进行比较。)这是我们大多数人通常对数据进行的简单工作 - 内存,但我需要使用的数据单元的大小和数量可能会使RAM成为一个问题,如果我试图将所有内容保存在内存中。我很快意识到我可能需要在几个点上将数据写入文件,以避免耗尽我的系统资源。我决定使用SQLite3。 (对于CSV来说这可能有点多了。)它相当轻巧,但其存储限制似乎安全地超出了我的要求。
我遇到的问题是确切了解结果集的工作原理。我遇到的文档似乎有点含糊不清。显然,每次执行SELECT语句时,SQLite都不会将全新的表写入数据库。这是否意味着它复制了一个完整的内存表中的所有选定字段,还是仅在内存中保留某种指针(而不是实际数据)?还有其他的东西吗?
我需要能够对有问题的数据进行排序。如果结果集实际上只是一个内存数据结构,那么简单地创建一个新表并在ORDER BY的帮助下填充它可能是一个坏主意。
答案 0 :(得分:1)
SQLite实际上没有结果集。它有游标,只允许访问当前行,而不能反向访问。
SQLite动态计算结果,因此一次只需要在内存中存储一行。
当计算需要访问多行(即聚合函数或没有可用索引的排序)时,尽可能多的数据保存在cache中,然后以{{3}溢出到磁盘}}