如何更有效地搜索超过3000万行的acoustid数据库?

时间:2016-03-15 21:36:35

标签: python mysql postgresql relational-database audio-fingerprinting

我目前正在玩一个名为acoustid的开源音乐识别项目。我导入了一个包含超过3000万行(300gb数据)的表,但是只需要花费大量的时间来选择这些行。目前,选择200,000行可能需要30秒。

项目提供acoustid-index来索引行,只需查看指纹的前15秒并将其存储在hdd ...然后加载到ram中。 https://bitbucket.org/acoustid/acoustid-index/overview

只是,我不知道如何使用它。方向令人困惑。这似乎是为PostgreSQL创建的。我正在服务的服务器上使用MySQL和Python。我还可以用它来索引我的数据库吗?

关于如何使用它来索引数据库中的行的任何建议?我还有其他方法可以更有效地搜索这个数据库吗?

2 个答案:

答案 0 :(得分:0)

在MySQL中,你可以通过定义你想要应用它的长度来使用BLOB / TEXT上的索引:

CREATE INDEX idx_nn_1 ON sometable(accoustic(500));

这会将前500个字节作为指纹索引(即:不是15秒)。

要使用15秒,您可以使用MD5SUM,将其添加为额外列,然后查询该15秒的MD5SUM。另外,你可以在完整的歌曲上使用MD5SUM。

答案 1 :(得分:0)

在处理大量数据时,就像在这种情况下一样,您需要了解并利用该结构来有效地使用它。你不能在你的数据库中有一个blob,并期望神奇地为它编制索引并快速搜索。

如果您有文本文档,通常的方法是使用搜索引擎来解析文本,从中提取单词,可能对它们进行一些后处理,然后在这些单词上创建索引。这是一个常见的用例,MySQL全文索引就是这样做的。例如。

在您的情况下,您有Chromaprint产生的声学指纹,这是一个不太常见的用例。没有内置的解决方案可以快速搜索。由您决定如何索引数据以及如何搜索数据取决于您。您需要了解指纹由32位哈希(相当于文本文档中的单词)组成,您需要了解反向索引的工作原理。如果您通过哈希对指纹进行索引,则无需扫描整个数据库,只会在倒排索引中查找特定的哈希值。

您可以使用如下表格在MySQL中构建一个非常粗略的反向索引:

CREATE TABLE fingerprint_hash (
  hash INT NOT NULL,
  fingerprint_id INT NOT NULL,
);

然后加载数据并创建物理索引:

CREATE INDEX fingerprint_hash_idx_hash ON fingerprint_hash(hash);

完成后,您可以像这样查询索引:

SELECT fingerprint_id, COUNT(*) AS num_matching_hashes
FROM fingerprint_hash
WHERE hash IN (627833118,627767582,627697982,627624254,627956095,...)
GROUP BY fingerprint_id

这将为您提供具有一些常见哈希值的指纹ID。

请注意,上述内容很可能仍然很慢。自定义AcoustID索引使用非常紧凑的格式,在内存中尽可能多地匹配数据,它只对指纹的某些部分进行索引,并且它甚至不存储整个哈希值,它会截断一些比特。所有这一切都是为了快速进行搜索。而且,在通常用于托管网站的普通服务器上,它仍然不够快。