【发布时间】:2010-01-20 06:51:05
【问题描述】:
我想统计很多字符串(>3G),所以我选择了带有(str TEXT PRIMARY KEY, count INTEGER DEFAULT 1)的表的SQLite。
大约有3G的字符串,每个占40*2/8=10字节,所以整个字符串是30GB。 这10个字节中有2^80种,比3G大很多。
那么如何有效更新呢?
UPDATE table SET count = count + 1 WHERE str = 'xxx';
# check whether rows infected
INSERT INTO table (str) VALUES ('yyy')
或者某事。比如INSERT OR REPLACE,我不太熟悉。
有什么建议吗?
我遵循思南乌努尔的方式:
PRAGMA synchronous = OFF;
PRAGMA journal_mode = OFF;
PRAGMA temp_store = MEMORY;
PRAGMA auto_vacuum = NONE;
PRAGMA cache_size = 4000000;
CREATE TABLE kmers ( seq TEXT );
SELECT seq,COUNT(seq) FROM kmers GROUP BY seq;
没有使用索引。自动提交为 0。
我还没有测试journal_mode OFF 是否更快。
temp_store 应该没用。
【问题讨论】:
-
您使用数据库是否有特殊原因?您是否希望只有很少的重复项并且担心内存?我不明白为什么你觉得你不能在内存中做到这一点。
-
这和 Perl 有关系吗?我倾向于删除
Perl标签,但我会稍等片刻,看看你能否澄清一下。 -
你能谈谈你想用这个完成什么吗?只计算你看到一个字符串的次数?