Python - 多处理和数据库条目

时间:2016-05-25 16:42:04

标签: python sqlite multiprocessing

我正在研究Digital Forensic Investigators的框架,用于比较我的Master的顶点项目的文件。但是,我遇到了一些麻烦......

我正在尝试在比较上实现多处理,因为使用单核似乎非常慢。然而,我遇到的麻烦是当代码将信息输入SQLite数据库时。当两个内核几乎同时完成时,它偶尔会出现“数据库被锁定”错误。

因此,我的问题的简单方面是,由于我遇到的错误,在多处理环境中操作数据库函数是不安全的吗?如果没有,是否存在一种安全的方法,不会导致随机错误?

谢谢!

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

你的问题是你正试图让多个作家访问一个玩具数据库 - 即sqlite--它存储在一个文件中。使用Lock可能有所帮助,但由于所有等待锁定的时间,它会破坏您的多进程吞吐量。从本质上讲,锁定阻塞点将序列化您的程序。

几乎在任何平台上设置MySQL或Postgres都很简单,并且有几个优秀的Python模块可以访问它们。使用其中一个将完全消除这个问题。

更新评论的扩展回复:

我总是问客户/学生,"你想解决什么问题?"我假设你没有尝试创建数据库系统,只需使用一个。 SQLite3适用于明确定义的一组问题,但多进程访问其中之一。我可以转向询问项目的哪个方面需要多进程访问,但我假设您已经确定需要这样做。我不知道你的编程技巧或你对数据库如何工作的理解,所以请原谅我以下是否有点基础。

通常你需要一个数据库(我的偏好是Postgres),以及一个Python模块,它可以理解如何与该数据库通信的所有细节。然后你需要知道你希望DBMS为你做什么。好消息是你不是第一个走这条路的人。

Postgres Wiki充满了好东西。在Python Drivers上查看他们的页面。 Psycopg2是类别的领导者,可在Win / Linux / Mac上运行。另请查看PyPi,即Python程序包索引,以获取许多编写良好的扩展程序。

如果您希望保持更多面向对象,而不是直接编写SQL,则可能需要查看ORM之类的SQLAlchemy。这是另一个维护良好且广泛部署的类别领导者。

使用ORM的价值在于,您(大多数时候)可以将您的头脑放在ObjectLand中,而大部分问题都存在于ObjectLand中,而不会陷入面向对象编程与关系数据库管理所产生的认知失调之中,这是两个非常不同的数据世界视图。

如果您需要更多帮助,请给我发电子邮件。我的地址在我的个人资料中。