【问题标题】:A fast local BLOB storage快速的本地 BLOB 存储
【发布时间】: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


    【解决方案1】:

    如果要加载的记录在磁盘上不相邻,则磁盘必须查找。 这些延误是不可避免的。

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

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 2023-03-12
      • 2019-10-22
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2019-08-17
      相关资源
      最近更新 更多