最佳数据挖掘数据库

15 投票
9 回答
11490 浏览
提问于 2025-04-15 21:14

我偶尔写Python程序,之前只用过MYSQL或SQLITE数据库。我在一家小公司负责所有电脑相关的事情,现在我开始了一个新项目,觉得是时候尝试新的数据库了。

销售部门每周都会生成一个CSV文件,我需要做一个小程序,让其他部门的人可以混合这些信息,主要是把记录关联起来。我已经解决了这个问题,但我的困扰是速度,因为我现在只是用普通的文本文件来处理这些数据,结果当然是非常慢。

我考虑过使用mysql,但这样的话每台电脑都得安装mysql,sqlite更简单,但速度也很慢。我并不需要一个完整的关系型数据库,只想找个方法能在合理的时间内处理大量数据。

更新:我觉得我之前没有详细说明我的数据库使用情况,导致问题描述得不够清楚。我正在从一个大约900兆的CSV文件中读取所有数据,然后把它放到一个Python字典里进行处理。我的问题主要是如何快速存储和读取这些数据。

非常感谢!

9 个回答

1

听起来每个部门都有自己的数据库,这样会导致很多不必要的重复和效率低下。

与其让每个人在网络上传输几百兆的数据,不如把数据放在MySQL里,让各个部门把他们自己的数据上传到这个数据库,这样大家都能访问到,数据也能更规范。

随着你们组织的发展,如果每个部门都有完全不同的数据库,彼此之间又不知道对方的存在,里面可能还会有重复或冲突的数据,这样会变得非常麻烦。

12

你可能真的需要一个完整的关系数据库管理系统(DBMS),如果现在不需要,过不了多久就会需要。如果你现在就开始使用它,虽然你的问题和数据还很简单,但等到它们变得复杂和棘手时,你至少会有一个数据库管理系统的经验来帮助你。你可能不需要在每台电脑上都安装MySQL,举个例子,你可以在服务器上安装它,然后通过网络把数据传输出去。不过,你可能需要提供更多关于你的需求、工具和设备的信息,这样才能得到更好的建议。

虽然其他数据库管理系统也有各自的优缺点,但对于大型和复杂的数据库来说,使用MySQL是没有问题的。我对SQLite了解不够,无法对此发表有见地的看法。

补充一下:@Eric,根据你对我回答的评论和其他回答,我更加坚定地认为是时候转向使用数据库了。我并不惊讶在一个900MB的Python字典上进行数据库操作会很慢。我觉得你首先要说服自己,然后再说服你的管理层,意识到你现在的工具已经无法满足需求,未来的发展会受到威胁,除非你重新考虑这个问题。

如果你的网络真的无法支持基于服务器的数据库,那么(a)你需要让你的网络变得更强大、可靠和高效,以满足这个目的;但(b)如果这不是一个选项,或者不是一个早期的选项,你应该考虑建立一个中央数据库服务器,向其他用户提供摘要、提取或报告,而不是让每个用户同时使用完整的客户端-服务器关系数据库管理系统。

你现在遇到的问题是因为没有合适的工具来完成工作。这些问题只会变得更糟。我希望我能提供一个神奇的方法让情况有所改善,但我做不到,我想其他人也不会。

16

快速总结

  • 要高效解决问题,你需要足够的内存(RAM)。我觉得你应该升级内存?? 在阅读优秀的High Scalability博客时,你会发现大网站为了高效解决问题,通常会把整个问题集存储在内存中。
  • 你确实需要一个中央数据库解决方案。我觉得仅仅用Python字典来处理是行不通的。
  • 如何解决“你的问题”取决于你的“查询”。我建议你先把数据放到ElasticSearch中(见下文),然后查询数据库(看看性能如何)。我认为这是解决你问题的最简单方法。不过,正如你在下面看到的,还有很多其他方法可以解决你的问题。

我们知道:

  • 你使用Python作为编程语言。
  • 你的数据库大约是900MB(我觉得这已经相当大了,但还是可以管理的)。
  • 你把所有数据都加载到一个Python字典中。我认为问题就在这里。Python试图把字典(而且Python字典也不是最节省内存的)存储在内存中,但你的内存不够(你有多少内存???)。当这种情况发生时,你会产生大量的虚拟内存。当你尝试读取字典时,数据会不断地从硬盘交换到内存中。这种交换会导致“抖动”。我假设你的电脑内存不足。如果是这样,我建议你先升级至少2GB的额外内存。当你的问题集能够完全放入内存时,解决问题会快得多。我翻开了我的计算机架构书,上面提到主内存的访问时间大约是40-80纳秒,而硬盘的访问时间是5毫秒。这是一个很大的差别。

缺失的信息

  • 你有中央服务器吗?你应该使用/拥有一个服务器。
  • 你的服务器是什么架构?Linux/Unix/Windows/Mac OSX?我认为你的服务器应该使用Linux/Unix/Mac OSX架构。
  • 你的服务器有多少内存?
  • 你能更详细地说明你的数据集(CSV)吗?
  • 你在做什么样的数据挖掘?你需要全文搜索的功能吗?我不认为你在做任何复杂的(SQL)查询。仅用Python字典来完成这个任务会很复杂。你能具体说明你想执行的查询吗?例如:
    • "获取所有在x部门工作的用户"
    • "获取用户x的所有销售记录"

需要数据库

我是一个小公司的计算机负责人,我开始了一个新项目,我觉得是时候尝试新的数据库了。

你说得对,你确实需要一个数据库来解决你的问题。仅用Python字典来完成这项工作是很困难的,尤其是当你的问题集无法完全放入内存时。

MySQL

我考虑过使用MySQL,但那样我需要在每台桌面电脑上安装MySQL,SQLite更简单,但速度很慢。我不需要一个完整的关系数据库,只需要一种能在合理时间内处理大量数据的方法。

一个集中式(客户端-服务器架构)数据库正是你解决问题所需要的。让所有用户从你管理的一个PC访问数据库。你可以使用MySQL来解决你的问题。

东京暴君

你也可以使用东京暴君来存储所有数据。东京暴君速度很快,而且不需要存储在RAM中。它处理数据的方式比使用Python字典更高效。不过,如果你的问题集可以完全放入内存,我认为你应该看看Redis(见下文)。

Redis:

你可以使用Redis(5分钟快速入门)(Redis非常快)来将所有销售数据存储在内存中。Redis功能强大,可以非常快速地执行这种查询。Redis唯一的问题是它必须完全放入RAM中,但我相信他们正在努力解决这个问题(夜间构建已经支持)。正如我之前提到的,从内存中完全解决你的问题集是大网站及时解决问题的方式。

文档存储

这篇文章尝试评估键值存储和文档存储,如CouchDB/Riak/MongoDB。这些存储在搜索方面更有能力(比键值存储稍慢),但在全文搜索方面表现不佳。

全文搜索

如果你想进行全文搜索查询,你可以看看:

  • elasticsearch(视频):当我看到elasticsearch的视频演示时,觉得它非常酷。你可以尝试把数据放入elasticsearch中(发布简单的JSON),看看它的速度如何。我在GitHub上关注elasticsearch,作者正在不断提交新代码。
  • solr(教程):许多大公司(如GitHub、Digg)都在使用solr来提供搜索功能。他们从MySQL的全文搜索转向solr后得到了很大的提升。

撰写回答