快速本地BLOB存储

时间:2013-11-30 13:39:27

标签: performance sqlite blob key-value key-value-store

我必须制作一个包含大量训练数据集的文本分类引擎(大约100万个文本,每个文本都有> = 1个类别)。

问题是为我的统计数据创建临时存储空间(文本要素,从每个文本中提取)。对于每个文本,我有两个数组:int [numOfFeatures](显示的特征的索引)和double [numOfFeatures](每个特征的权重)。在numOfFeatures == 3000的情况下,它的大小约为36 Kb,或者所有基数为36 Gb。

我尝试使用SQLite数据库,将数组打包为BLOB:

CREATE TABLE 'docBlobs' ('docId' INTEGER, 'featureIndexes' BLOB, 'featureWeights' BLOB );

CREATE INDEX 'docIdIndex_docBlobs' ON 'docBlobs' ('docId' ASC);

此类统计数据的主要用例是给定类别的BLOB的顺序迭代加载。每个类别的文档ID的信息存储在内存中,我尝试了一些通过一组已知ID加载BLOB的方法。

首先,我尝试了

SELECT * FROM 'docBlobs' WHERE 'docBlobs'.'docId' = '?'

在一个循环中。它每秒约20行。

然后,我尝试在内存中创建临时表,将所需的ID放在那里并将其用作IN列表:

PRAGMA temp_storage = MEMORY

CREATE TEMP TABLE 'tempTable' ('docId' INTEGER)

INSERT INTO 'tempTable' VALUES (?)

SELECT * FROM 'docBlobs' WHERE 'docBlobs'.'docId' IN (SELECT 'tempTable'.'docId' FROM 'tempTable')

它给了我大约每秒20行。

然后我尝试用临时表进行JOIN。也给了我大约每秒20行。

难道你不知道如何为我的任务获得正常的阅读速度吗?

P.S。在SELECT * FROM 'docBlobs'的情况下,读取速度大约是每秒1000行,就像我的硬盘速度一样。

1 个答案:

答案 0 :(得分:0)

如果要加载的记录在磁盘上不相邻,则磁盘必须搜索。 这些延迟是无法避免的。

如果您按类别加载文档,则可以尝试按类别存储它们,但如果每个文档有多个类别,则不起作用。