我必须制作一个包含大量训练数据集的文本分类引擎(大约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行,就像我的硬盘速度一样。
答案 0 :(得分:0)
如果要加载的记录在磁盘上不相邻,则磁盘必须搜索。 这些延迟是无法避免的。
如果您按类别加载文档,则可以尝试按类别存储它们,但如果每个文档有多个类别,则不起作用。