我是一个偶尔的Python程序员,到目前为止只使用MYSQL或SQLITE数据库.我是一家小公司的计算机人员,我已经开始了一个新的项目,我认为这是时候尝试新的数据库.
销售部门每周进行一次CSV转储,我需要制作一个小型脚本应用程序,允许人们组成其他部门混合信息,主要是链接记录.我已经解决了所有这些问题,我的问题是速度,我只是使用纯文本文件而且毫不奇怪它很慢.
我想过使用mysql,但后来我需要在每个桌面安装mysql,sqlite更容易,但速度很慢.我不需要一个完整的关系数据库,只需要在适当的时间内使用大量数据.
更新:我想我的数据库使用情况并不是很详细,因此严重地解释了我的问题.我正在读取所有数据〜900 Megas或更多,从csv到Python字典,然后使用它.我的问题是存储并且主要是快速读取数据.
非常感谢!
您需要足够的内存(RAM)来有效地解决您的问题.我觉得你应该升级内存?在阅读优秀的高可伸缩性博客时,您会注意到,对于大型网站来说,有效地解决问题,他们将完整的问题集存储在内存中.
您需要一个中央数据库解决方案.我不认为用python字典做这个只会完成工作.
如何解决"你的问题"取决于你的"查询".我首先尝试做的是将数据放入弹性搜索(见下文)并查询数据库(查看它的执行情况).我认为这是解决问题的最简单方法.但正如您可以在下面阅读的那样,有很多方法可以解决您的问题.
您使用python作为您的程序语言.
你的数据库大约是900MB(我认为它非常大,但绝对可管理).
您已将所有数据加载到python词典中.在这里,我假设问题奠定了.Python试图在你的内存中存储字典(也是python字典不是最友好的内存),但是你没有足够的内存(你有多少内存?).当发生这种情况时,你将拥有大量的虚拟内存.当您尝试读取字典时,您不断地将光盘中的数据交换到内存中.这种交换导致" 垃圾 ".我假设你的电脑没有足够的Ram.如果是真的那么我会先用至少2 GB的额外RAM升级你的内存.当你的问题集能够适应内存时,解决问题的速度会快得多.我打开了我的计算机体系结构书,其中(内存层次结构)表示主内存访问时间约为40-80ns,而磁盘内存访问时间为5 ms.这是一个巨大的差异.
你有一个中央服务器吗?你应该使用/拥有一台服务器.
您的服务器具有哪种架构?Linux/Unix/Windows/Mac OSX?在我看来,你的服务器应该有linux/Unix/Mac OSX架构.
你的服务器有多少内存?
您能否更好地指定数据集(CSV).
你在做什么样的数据挖掘?您需要全文搜索功能吗?我不是假设你正在做任何复杂的(SQL)查询.仅使用python字典执行该任务将是一个复杂的问题.你能正式确定你想要执行的查询吗?例如:
"get all users who work for departement x"
"get all sales from user x"
我是一家小公司的计算机人员,我已经开始了一个新的项目,我认为这是时候尝试新的数据库.
您确定需要一个数据库来解决您的问题.仅使用python词典自己做这件事很困难.特别是当您的问题集无法适应内存时.
我想过使用mysql,但后来我需要在每个桌面安装mysql,sqlite更容易,但速度很慢.我不需要一个完整的关系数据库,只需要在适当的时间内使用大量数据.
集中式(客户端 - 服务器架构)数据库正是您解决问题所需的.让所有用户从您管理的1台PC访问数据库.您可以使用MySQL来解决您的问题.
您也可以使用Tokyo Tyrant存储您的所有数据.东京暴君非常快,不必存储在RAM中.它处理数据的效率更高(而不是使用python字典).但是,如果你的问题完全适合记忆,我认为你应该看看Redis(下图).
例如,您可以使用Redis(在5分钟内快速启动)(Redis非常快)将所有销售存储在内存中.Redis非常强大,可以疯狂地进行这种查询.Redis的唯一问题是它必须完全适合RAM,但我相信他正在努力(夜间构建已经支持它).也像我之前说的那样,以前完全从内存中解决问题集是大型网站如何及时解决问题.
该文章试图与文档商店像CouchDB的/了Riak/MongoDB的评估KV-店.这些商店能够更好地搜索(比KV商店慢一点),但不擅长全文搜索.
如果你想做全文搜索查询,你可以在:
elasticsearch(视频):当我看到elasticsearch的视频演示时,它看起来很酷.您可以尝试在弹性搜索中放入(发布简单的json)数据,看看它的速度有多快.我正在关注github上的elastissearch,作者正在提交大量新代码.
solr(教程):许多大公司正在使用solr(github,digg)来支持搜索.从MySQL全文搜索到solr,他们得到了很大的推动.
您可能确实需要一个完整的关系型DBMS,如果不是现在,很快就会.如果您现在就开始,而您的问题和数据简单明了,那么当它们变得复杂和困难时,您将拥有至少一个DBMS的丰富经验来帮助您.您可能不需要在所有桌面上使用MySQL,例如,您可以将其安装在服务器上并通过网络提供数据,但您可能需要提供有关您的需求,工具集和设备的更多信息以获得更好的建议.
而且,虽然其他DBMS也有自己的优点和缺点,但对于大型和复杂的数据库,MySQL没有任何问题.我对SQLite的知识不足以了解它.
编辑:@Eric从您的评论到我的答案和其他答案我更强烈地形成了这样的观点,即你是时候搬到数据库了.尝试在900MB Python字典上进行数据库操作的速度很慢,我并不感到惊讶.我认为你必须首先说服自己,然后是你的管理层,你已经达到了目前工具集能够应对的极限,并且除非你重新思考问题,否则未来的发展将受到威胁.
如果你的网络真的不能支持基于服务器的数据库而不是(a)你真的需要使你的网络健壮,可靠和高性能足以达到这个目的,但(b)如果这不是一个选择,或者不是一个早期选项,你应该考虑将中心数据库服务器传递给其他用户的摘要/提取/报告,而不是在客户端 - 服务器配置中同时工作的完整RDBMS.
您目前遇到的问题是没有合适的工具.他们只会变得更糟.我希望我可以建议一种不是这种情况的神奇方式,但我不能,而且我不认为其他人会这样做.