【问题标题】:python or database?python还是数据库?
【发布时间】:2010-08-05 22:13:16
【问题描述】:

我正在将 csv 文件读入 python 中的列表列表。现在大约100mb。几年后,该文件将达到 2-5gigs。我正在对数据进行大量日志计算。 100mb 的文件需要大约 1 分钟的时间来完成。在脚本对数据进行了大量摆弄之后,它会创建指向谷歌图表的 URL,然后在本地下载图表。

我可以继续在 2gig 文件上使用 python 还是应该将数据移动到数据库中?

【问题讨论】:

  • 您的数据是否发生了变化?换句话说,旧的原始行会随着时间而改变吗?
  • 不,旧行不会随时间改变
  • 您需要计算/下载所有行的图表,还是只需要日志中的新条目?图表也会随时间变化吗?
  • 您的计算是密集计算(大量浮点数据/模拟/模型评分)还是简单的求和/计数/趋势/分组?
  • 我对数据集中的每一行取对数,然后做一些简单的事情,比如乘法

标签: python sql


【解决方案1】:

我不知道你在做什么。但是数据库只会改变数据的存储方式。事实上,它可能需要更长的时间,因为大多数合理的数据库可能会对列施加约束并进行额外的检查处理。在许多情况下,将整个文件放在本地,进行计算比查询并将其写回数据库更有效(受磁盘速度、网络和数据库争用等影响)。但在某些情况下,数据库可能会加快速度,特别是因为如果您进行索引,很容易获得数据的子集。

无论如何,您都提到了日志,所以在您为数据库疯狂之前,我有以下想法供您检查。无论如何,我不确定您是否必须从一开始就一直浏览所有日志才能下载图表,并且您希望它会增长到 2 GB,或者最终您是否希望每天/每周有 2 GB 的流量。

  1. 归档——您可以归档旧日志,比如每隔几个月。将生产日志复制到存档位置并清除实时日志。这将保持文件大小合理。如果您浪费时间访问文件来查找所需的小片段,那么这将解决您的问题。

  2. 您可能需要考虑转换为 Java 或 C。尤其是在循环和计算方面,您可能会看到 30 倍或更多的加速。这可能会立即减少时间。但随着时间的推移,随着数据的增加,有一天这也会放缓。如果你对数据量没有限制,最终即使是世界上最伟大的程序员手工优化的汇编也会太慢。但它可能会给你 10 倍的时间......

  3. 您可能还需要考虑找出瓶颈(是否是磁盘访问,是否是 CPU 时间),并在此基础上找出并行执行此任务的方案。如果它正在处理,请查看多线程(最终是多台计算机),如果是磁盘访问,请考虑在多台机器之间拆分文件......这真的取决于你的情况。但我怀疑归档可能会消除这里的需要。

  4. 正如建议的那样,如果您一遍又一遍地进行相同的计算,那么只需将它们存储起来。无论您使用数据库还是文件,这都会给您带来巨大的加速。

  5. 如果您正在下载内容并且这是一个瓶颈,请使用 if modified 请求查看条件获取。然后只下载更改的项目。如果您只是在处理新图表,请忽略此建议。

  6. 1234563
  7. 在整个数据库之前,您可能需要考虑 SQLite。

  8. 最后,“几年”在程序员的时间里似乎很长。即使只有2个,也可以改变很多。也许你的部门/部门会被解雇。也许你会继续前进,你的老板。也许系统会被其他东西取代。也许不再需要你正在做的事情。如果是 6 个月,我会说修复它。但是几年来,在大多数情况下,我会说只需使用您现在拥有的解决方案,一旦它变得太慢,然后再考虑做其他事情。你可以在代码中写下你对这个问题的想法,甚至可以给你的老板发一封电子邮件,这样他也知道。但只要它有效并且会在合理的时间内继续这样做,我现在就认为它“完成”了。无论您选择哪种解决方案,如果数据无限增长,您都需要重新考虑它。添加更多机器、更多磁盘空间、新算法/系统/开发。解决“几年”可能还不错。

【讨论】:

  • java 或 C 比 python 快 30 倍?!?!?!
  • 今天的 Great Language Shootout 以最快的速度击败 Python 10 倍。 Python 经常很慢。
  • 这取决于你在做什么。编译语言对于紧密循环和计算有很大的优势。对于这些类型的东西,10 倍以上的差异并非闻所未闻。
  • @Paul nathan - 哇。实际上,这就是我在 C 和 Python 之间的一些测试中看到的 30 倍速度(尽管不是最近)。 C 和 Python 之间只有 10 倍是 Python 的巨大改进......
【解决方案2】:

如果您每次执行“摆弄”时都需要遍历所有行,那么它并没有太大的区别,假设实际的“摆弄”正在吞噬您的周期。

也许您可以以某种方式存储计算结果,那么数据库可能会很好。此外,数据库具有确保数据完整性的方法和类似的东西,因此数据库通常是存储大量数据的好地方(duh!;))。

【讨论】:

  • +1 表示“存储计算结果”。我要指出的是,如果您选择在计算结束时将它们添加到文件中,那么它也可能是一个文件,所以这是一个清洗。
  • 是的 :) 当然,数据库最终只是一些花哨的算法和“文件”。因此,如果您愿意,您可以使用 python 重新发明数据库(实际上听起来很有趣......)。
  • 通常数据库是用编译语言编写的,而对于某种编译语言,Python 相差几个数量级。此外,有时数据库可以自动为您跨处理器/磁​​盘并行处理。但与此同时,数据库大多只是另一种存储数据的方式。除非您计划以某种特定的方式利用它为速度提供的东西,否则它不会神奇地让事情变得更快。在每条记录的基础上,甚至脚本语言也常常胜过 SQL 游标。
【解决方案3】:

我只会在以下情况下将其放入关系数据库:

  1. 数据实际上是相关的,以这种方式表达它有助于通过规范化数据集来缩小数据集的大小。
  2. 您可以利用触发器和存储过程来卸载 Python 代码现在正在执行的一些计算。
  3. 您可以利用查询仅对已更改的数据执行计算,从而减少 Python 完成的工作量。

如果这些都不是真的,我认为数据库和文件之间没有太大区别。两者最终都必须存储在文件系统中。

如果 Python 必须处理所有这些,并且将其放入内存意味着加载整个数据集,那么数据库和平面文件之间没有区别。

内存中 2GB 的数据可能意味着您的应用程序会进行页面交换和抖动。在将问题归咎于文件之前,我会小心并获取一些数据。仅仅因为您从数据库中访问数据并不能解决分页问题。

如果您的数据是扁平的,我认为数据库的优势较小,除非“扁平”==“高度非规范化”。

我建议在进行更改之前进行一些分析以查看消耗 CPU 和内存的内容。您现在正在猜测根本原因。最好获取一些数据,这样您就知道时间花在了哪里。

【讨论】:

  • 如果我错了,请纠正我,但是例如,对于需要您对内容进行排序的大文件,数据库会更好,对吧?
  • 答案取决于文件和架构。您说得对,数据库擅长排序,但还有其他考虑因素:索引、JOIN 数量等。
  • 它是平的。没有关系数据
  • 数据库通常非常擅长对大量数据进行排序。例如,如果列表不适合您的内存,那么在 python 中对一个大的 ol' 列表进行排序可能不是很有效。此外,索引可以让您有效地搜索数据。
  • @Andre - 同意,但没有迹象表明数据处理必须排序或计算取决于数据的排序顺序。
【解决方案4】:

我总是为更大的数据集寻找数据库。

数据库给了我一些“免费”的东西;也就是说,我不必编写代码。

  • 正在搜索
  • 排序
  • 索引
  • 与语言无关的连接

像 SQLite 这样的东西可能是你的答案。

此外,您应该调查“nosql”数据库;听起来您的问题可能很适合其中之一。

【讨论】:

  • 此外,数据库还为您提供了您不需要的东西,例如并发、锁定、约束等...大多数情况下您想要这些,但从文本文件中添加了您不想要的额外内容。一定要探索优化您的文本文件,然后是 NOSQL 和 SQLLite 解决方案。最后是数据库。虽然我认为只是为了加快数据库的速度并没有帮助。您可能可以自己进行更快的排序。 4GB 已经适合内存,因此快速排序(即使是两次快速排序和一次合并)可能会胜过数据库排序。
  • 错误假设您没有使用 Python 进行排序......在这种情况下,编译的优势甚至可以使数据库排序比 Python 更快地处理大量记录......
  • nosql 是一类数据库管理系统——通常它们没有关系约束,通常它们没有 ACID 属性。
  • @Cervo:“NoSQL”==“不仅仅是 SQL”。看看 CouchDB、Voldemort、Neo4J、Hadoop、BigTable 等nosql-database.org
  • 我在想一些更简单的 NoSQL 解决方案。但通常任何数据库都带有整个事务处理/锁定包和数据完整性检查。并非所有 NoSQL 解决方案都具备这些功能。有些比其他更复杂,用于处理交易的不同方面。我想的是像 BDB 这样的超级简单的东西(我认为这不适用于这个问题),而不是像 BigTable 或 Cassandra 这样的东西。
【解决方案5】:

在 2 场演出时,您可能会开始遇到速度问题。我使用模型模拟,它调用数百个 csv 文件,大约需要一个小时来完成 3 次迭代,或者每个循环大约 20 分钟。

这是个人喜好问题,但我会选择 PostGreSql 之类的东西,因为它结合了 python 的速度和 sql 驱动的关系数据库的容量。几年前,当我的 Access 数据库自身损坏并每天崩溃时,我遇到了同样的问题。它是 MySQL 或 PostGres,我选择 Postgres 是因为它对 python 友好。并不是说 MySQL 不能与 Python 一起工作,因为它可以,这就是我说它的个人偏好的原因。

希望对您的决策有所帮助!

【讨论】:

  • 非常感谢,这很有帮助。你能给我一个例子说明为什么 postgres 更好吗?
  • 我不会说 Postgres 比 MySQL 甚至 Oracle 更好。对我来说,这是成本。 Postgres 是开源的,我的数据库是非商业的,所以我希望尽可能保持透明和灵活。我也喜欢 PostgreSQL 的界面,从可用性的角度来看,它符合我的学习曲线。
  • 我认为 duffymo 的解释涵盖了它。关系数据库非常强大,可以处理您要求 python 执行的许多任务。但是,如果您只是对存储和引用感兴趣,那么查询/计算几乎没有用处。我的假设是您最终将执行计算和添加/更改数据,这就是我建议使用 RDBMS 的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2011-02-23
  • 1970-01-01
  • 2012-08-01
  • 2019-12-30
  • 1970-01-01
相关资源
最近更新 更多