我是一名偶尔会使用MYSQL或SQLITE数据库的Python程序员。我是一家小公司的计算机人员,我已经开始了一个新的项目,我认为这是时候尝试新的数据库。
销售部门每周进行一次CSV转储,我需要制作一个小型脚本应用程序,允许人们组成其他部门混合信息,主要是链接记录。我已经解决了所有这些问题,我的问题是速度,我只使用纯文本文件进行所有这些,并且毫不奇怪它非常慢。
我考虑过使用mysql,但后来我需要在每个桌面上安装mysql,sqlite更容易,但速度很慢。我不需要一个完整的关系数据库,只需要在适当的时间内使用大量数据。
更新:我想我的数据库使用情况并不是很详细,因此很难解释我的问题。我正在读取所有数据〜900 Megas或更多,从csv到Python字典,然后使用它。我的问题是存储并且主要是快速读取数据。
非常感谢!
答案 0 :(得分:16)
答案 1 :(得分:12)
如果不是现在,您可能需要一个完整的关系型DBMS。如果您现在就开始,而您的问题和数据简单明了,那么当它们变得复杂和困难时,您将拥有至少一个DBMS的丰富经验来帮助您。您可能不需要在所有桌面上安装MySQL,例如可以将其安装在服务器上并通过网络提供数据,但您可能需要提供有关您的需求,工具集和设备的更多信息以获得更好的建议。
而且,虽然其他DBMS也有自己的优点和缺点,但对于大型和复杂的数据库,MySQL没有任何问题。我对SQLite的知识不足以了解它。
编辑:@Eric从您的评论到我的答案以及其他答案我更加强烈地认为是您搬到数据库的时候了。尝试在900MB Python字典上进行数据库操作的速度很慢,我并不感到惊讶。我认为你必须先说服自己,然后是你的管理层,你已经达到了当前工具集可以应对的极限,并且未来的发展会受到威胁,除非你重新思考问题。如果您的网络确实不能支持基于服务器的数据库而不是(a)您真的需要使您的网络足够稳健,可靠和高性能以达到此目的,但(b)如果这不是一个选项,或者不是一个早期的选择,你应该考虑将中心数据库服务器传递给其他用户的摘要/提取/报告,而不是在客户端 - 服务器配置中同时工作的完整RDBMS。
您目前遇到的问题是没有合适的工具。他们只会变得更糟。我希望我可以建议一种不是这种情况的神奇方式,但我不能,而且我认为其他任何人都不会。
答案 2 :(得分:1)
以下是不同数据库套装的性能基准 - > Database Speed Comparison
我不确定上述比较是多么客观,因为它是在sqlite.org上托管的。 Sqlite在删除表时似乎有点慢,否则你应该没有任何问题使用它。 sqlite和mysql似乎都有自己的优点和缺点,在某些测试中,一个更快另一方面,在其他测试中,情况恰恰相反。
如果您遇到的性能低于预期,也许不是导致此问题的sqlite,您是否进行过任何分析或确保没有其他因素导致您的程序行为异常?
编辑:更新了指向稍微更新的速度比较的链接。
答案 3 :(得分:1)
你有没有做过任何基准测试,以确认文本文件是否会减慢你的速度?如果你还没有,那么调整代码的其他部分很有可能加快速度,以便它足够快。
答案 4 :(得分:1)
听起来每个部门都有自己的封建数据库,这意味着很多不必要的冗余和低效率。
为什么不将数据保存在MySQL中,让各部门将他们的数据上传到数据库,而不是向网络中的每个人传输数百兆字节,而不是每个人都可以对数据库进行规范化和访问?
随着您的组织的发展,拥有完全不同的部门数据库,彼此不了解,并且包含潜在的冗余或冲突数据,将会变得非常痛苦。
答案 5 :(得分:1)
此过程运行的机器是否有足够的内存和带宽来有效地处理这个问题?将MySQL放在慢速机器上并重新编码工具以使用MySQL而不是文本文件可能比简单地添加内存或升级机器要昂贵得多。
答案 6 :(得分:1)
自从我发布这个问题已经有几个月了,我想让大家知道我是如何解决这个问题的。我使用Berkeley DB和模块bsddb而不是加载Python字典中的所有数据。我不是很开心,但我的用户是。 我的下一步是尝试使用redis获得共享服务器,但除非用户开始抱怨速度,否则我怀疑我会得到它。 非常感谢所有在这里提供帮助的人,我希望这个问题和答案对其他人有用。
答案 7 :(得分:0)
如果你对CSV文件有这个问题,也许你可以挑选字典并生成带有pickle.HIGHEST_PROTOCOL
选项的pickle“二进制”文件。它可以更快地读取并获得更小的文件。您可以加载一次CSV文件,然后生成pickle文件,从而在下次访问时加快加载速度。
无论如何,有了900 Mb的信息,你将会花一些时间将它加载到内存中。另一种方法是不在内存上加载它一步,但在需要时只加载信息,可能按日期或任何其他类别(公司,类型等)制作不同的文件。
答案 8 :(得分:0)
看看mongodb。