【问题标题】:Using sqlite for very large merges and basic queries使用 sqlite 进行非常大的合并和基本查询
【发布时间】:2010-11-30 02:20:00
【问题描述】:

我是数据库的新手,我正在尝试找出一个处理大型数据集的好解决方案。我主要使用 R 进行统计分析,所以我不需要数据库作为网页的后端或任何东西。数据集通常是静态的 - 它们只是很大。

我试图在 ~1,400,000 表上对 ~10,000,000 条记录表进行简单的左连接。 1.4 m 的表有唯一的记录。搅动了3个小时后,它对我停止了。查询指定正确 - 我运行它,将检索限制为 1000 条记录,它完全按照我的预期返回。最终,我找到了一种将其拆分为 10 个查询并运行的方法,但此时,我能够很快在 R 中进行合并,而无需对 sqlite 和索引进行所有花哨的调用。

我一直在寻找使用数据库,因为我认为它们对于这些基本数据操作来说更快/更有效,但也许我只是忽略了一些东西。在上面的示例中,我在适当的列中建立了索引,令我惊讶的是 sqlite 无法处理它而 R 可以。

对不起,如果这个问题有点模糊(我对数据库有点模糊),但如果有人对明显的事情有任何建议,我做错了没有利用 sqlite 的力量,那就太好了.还是我只是期待其中的大部分内容,而 100 m X 1.4 m 的记录合并太大而无法在不破坏的情况下执行?

我认为数据库在这方面可以胜过 R 吗?

谢谢!

EXL

【问题讨论】:

  • 我认为您的查询有问题(在效率方面)。如果您发布它,应该有人可以提供帮助。
  • 您是否正在索引您的表?例如,在表模式中,有类似“CREATE INDEX mapping_ind ON mapping (id);”的内容- 我发现通过在我想加入的字段上创建索引来加速 sqlite3 加入。
  • 正如已经指出的那样,它通常会归结为与您的查询相关的表/索引设置。

标签: sql sqlite r


【解决方案1】:

我正在经历同样的过程。如果您查看我最近提出的问题,您可能会得到一些很好的指导,或者至少避免我浪费了很多时间:)。简而言之,这是对我最有帮助的内容。

-- RSQLite

-- RSQLite.extfuns

-- SQLite FAQ

我还是个新手,但一般来说,您应该使用 SQLite 对太大而无法导入 RAM 的数据进行子集处理。我认为如果数据足够小可以在 RAM 中处理,那么最好使用原生 R 工具进行连接/子集。如果您发现自己对 SQL 查询更加熟悉,那么可以使用 sqldf 包。此外,JD Long 有一个很棒的 discussion 在使用 sqldf 处理大型数据集。

【讨论】:

  • 如果您向 R 新手提供建议,使用适当的大写字母是个好主意,因此我建议您编辑答案以拼写包“sqldf”。还有大量专家认为把包称为库,让他们大发雷霆。库是包所在的地方。(在这一点上,我不是敏感类型之一,但希望警告你会有所帮助。)
  • @DWin -- 完成。谢谢你的课!
  • @JD -- NP。信用到期的信用。那篇文章对我很有帮助。
【解决方案2】:

我不得不承认,我很惊讶这对你来说是个问题。 SQLite 一直对我很有效,至少在速度方面。但是——SQLite 很简单,因为它非常灵活。 SQLite 可能很危险,因为它非常灵活。 SQLite 往往对数据类型非常宽容。有时这绝对是天赐之物,当我不想花大量时间将事情调整到完美时,但具有很大的灵活性就会带来很大的责任。

我注意到我需要小心地将数据移动到 SQLite 中。文字很简单。但是,有时数字会存储为文本而不是数字。对一列数字执行 JOIN 比对一列文本执行相同的 JOIN 更快。如果您的数字列存储为文本,然后强制转换为数字进行比较,您将失去使用索引的大部分优势。

我不知道您是如何将数据导入 SQLite 的,所以我要做的第一件事就是查看您的表模式并确保它们有意义。虽然它们看起来很明显,但索引可能很棘手。查看查询也可能会产生一些有用的信息。

在无法查看底层结构和查询的情况下,此问题的答案将是有根据的猜测。

【讨论】:

  • 将尽快整理我的结构和查询,谢谢。我听说对数字进行连接比文本更快。这是真的,即使它们被编入索引?我最终将我加入的那些列转换为数字,但我认为这样的编码是通过创建索引来完成的?
  • 正如他们所说——这取决于。如果文本是一个因素,则对包含文本的列进行索引可能非常有效。例如 - “M”或“F”。字符串上的索引同时也是主键,或者对于大量行来说是唯一的,这实际上是在浪费时间和存储空间。但是,数字索引很有用,因为计算机可以轻松比较大小,从而以更有效的方式搜索索引。事实上 - 有许多有效的方法来搜索不适用于文本的数字。如果您的文本字符串每行都相当独特 - 您的索引是白费力气。
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2019-12-08
  • 1970-01-01
  • 2018-11-11
相关资源
最近更新 更多