- 主题:求问如何从10亿个字符串里快速取数据
可以用,取决于你想付出什么代价来达到你想要的效果。
redis把数据全部加载到内存,如果内存不够,就是使用LRU淘汰掉旧数据(还有其他策略,防杠)
一台机器不够,可以搞个redis集群,让内存足够大。
但是如果你没有那么大的内存,可以考虑hbase,row对应你的key。
如果你连搭hbase的机器都不够,考虑下多台mongodb
如果你连mongodb都装不了,你可以使用普通关系数据库,分库分表或者集群化方案。
【 在 chemphy123 的大作中提到: 】
: 我搜了一下,貌似一种叫key-value的数据库适合我这应用场景
: redis我可以用吗?
: 网上说是把数据都载入内存,我没搞懂redis到底把啥载入内存。
: ...................
--
修改:lokta FROM 223.104.97.*
FROM 223.104.97.*
要把k,v都存进去。
单机搞这个我会选clickhouse
会python的话可以选duckdb,列存可以处理上亿数据
【 在 chemphy123 的大作中提到: 】
: 请问大神128G内存够吗?
: Redis是把整库的key和value全部载入内存吗?
--
修改:lokta FROM 223.104.94.*
FROM 223.104.94.*
试了下DUCKDB,查询时间7,8秒
放parquet会更慢点,但是更省内存。
作分析够用了,但是如果是作为查询服务得用其他方法。
import duckdb
import random
row_count = 1_000_000_000
conn = duckdb.connect()
conn.execute("create table test_table(id integer);")
sql = """insert into test_table select id from generate_series(%s) t(id);""" % row_count
conn.execute(sql)
data_list = [str(i) for i in random.choices(range(row_count), k=20000)]
conn.execute("select * from test_table where id in (%s)" % ','.join(data_list));
result = conn.fetchall()
【 在 chemphy123 的大作中提到: 】
: 我有10亿个字符串,每个大概100个字符。
: 这些数据存磁盘上,gzip压缩后大概有18G。
: 需求是,一次按id号从中取20000个字符串出来。
: ...................
--
FROM 223.104.94.*
SSD,但是CPU很挫。
【 在 chemphy123 的大作中提到: 】
: 你的硬盘是SSD吗?
--
FROM 223.104.94.*
数据加载到duckdb需要时间,直读parquet就没那么快。
你如果有反复查询得需求还是建议clickhouse
【 在 chemphy123 的大作中提到: 】
: Duckdb这么快?
: 我捣鼓了一下午的rocksdb-python,
: 当数据库是1亿记录的时候,取20000数据还比较快,可以秒出。
: ...................
--
FROM 223.104.94.*