【发布时间】:2013-12-16 13:04:29
【问题描述】:
我必须使用大型训练数据集(约 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 行。
你不知道一种方法可以让我的任务获得正常的阅读速度吗?
附:在SELECT * FROM 'docBlobs' 的情况下,读取速度约为每秒 1000 行,就像我的 HDD 的速度一样。
【问题讨论】:
标签: performance sqlite blob key-value key-value-store