BLOB存储-100+ GB,MySQL,SQLite或者PostgreSQL + Python
我有一个简单的应用程序构想,该应用程序将监视一组文件夹,对找到的所有文件建立索引。 gui可以让我快速标记新文件并将它们移动到单个数据库中进行存储,还可以提供一种简单的机制来按标记,名称,文件类型和日期查询数据库。目前,在几个可移动硬盘上有大约100+ GB的文件,数据库至少会那么大。如果可能,我希望支持对嵌入式二进制和文本文档进行全文搜索。这将是一个单用户应用程序。
不是试图发动数据库大战,但是哪种开源数据库最适合我?我很确定SQLLite不在桌面上,但是我可能是错的。
解决方案
回答
我总是讨厌回答"不要",但最好使用Lucene(PyLucene)之类的索引。几乎总是建议将路径而不是文件内容存储在数据库中。
除此之外,这些数据库引擎都不会将LOB存储在单独的数据空间中(它们将被嵌入表的数据空间中),因此,这些引擎中的任何一个都应该表现得差不多(除了sqllite)。我们需要移至Informix,DB2,SQLServer或者其他服务器来获得这种二进制对象处理。
回答
为什么要完全将文件存储在数据库中?只需存储元数据和文件名。如果出于某种原因需要将它们复制到新位置,只需将其作为文件系统副本进行即可。
一旦删除了文件内容,那么任何称职的数据库都将能够处理数十万个文件的元数据。
回答
因为我们不想索引文件的实际内容,所以它们中的几乎任何一个都可以工作(即使不是要在并发多用户环境中使用SQLLite,这可能是个问题……)。
唯一的限制因素是给定DB的最大"数据包"大小(按我指的是查询/响应的数据包)。通常,这些限制约为2MB,这意味着文件必须小于2MB。当然,我们可以增加此限制,但是整个过程效率很低,因为例如要插入文件,我们必须:
- 将整个文件读入内存
- 在查询中转换文件(通常意味着对文件进行十六进制编码-因此从一开始就将其大小加倍)
- 执行生成的查询(对于数据库,它本身意味着必须对其进行解析)
我将使用一个简单的数据库以及使用命名约定存储的关联文件,这使它们易于查找(例如,基于主键)。当然,这种设计不是"纯粹的",但是它会表现得更好,也更易于使用。
回答
我仍在为自己的项目之一研究此选项,但CouchDB可能值得一看。
回答
我们为什么要浪费时间来模拟文件系统应该能够处理的内容?更多存储+ grep是答案。
回答
我的偏好是将文档与元数据一起存储。原因之一是关系完整性。如果没有数据库代理操作,则无法轻松移动文件或者修改文件。我敢肯定我可以解决这些问题,但是它并不是我想要的那么干净,我的经验是,如今大多数供应商都可以处理数据库中的大量二进制数据。我想我想知道PostgreSQL或者MySQL在这些领域是否有任何明显的优势,我主要是对Oracle熟悉。无论如何,感谢答复,如果数据库知道外部文件在哪里,那么如果我愿意,以后也可以很容易地将文件放入。问题的另一个方面是使用Python时是否更容易使用任何一个数据库。我以为那是洗。