我有一个包含1000行和大约15列的CSV文件。我计划将每行作为Redis值存储为简单的JSON对象,将CSV文件的行号存储为Redis键。但是,一旦我开始将多个CSV文件上传到Redis,在数据库中区分一个CSV文件与另一个CSV文件的最佳方法是什么?除了不同的Redis数据库实例本身以外,除了Redis之外没有其他更大结构的所有键值是不是Redis?我知道Redis在记忆中,但即便如此......如果你有数百万条记录,搜索所需的密钥效率是不是很低?我不明白。如果我上传了100万个CSV文件,每个文件有1000行,那么搜索记录就会达到10亿条,即使对于内存数据库也是如此。我应该采取另一种方式。
我正在寻找一种方法,以高效和合理的方式在Redis中表示我的每个CSV文件,其中每个CSV文件行都有自己的唯一键,Redis值将是列标题和数据。
我如何做到这一点?
一个解决方案是每个键代表整个CSV文件,但我希望看看是否还有其他选项。
答案 0 :(得分:2)
你很有创意。
您没有说明将所有CSV分开,或者是否所有数据都集中在一个"组" -ish类型的逻辑结构中是否重要(就像你在RDBMS的表中一样)。
假设所有数据可以组合在一起运行,您可以保留一个键来为每个"行"
增加ID的全局计数器// synchronous for easy writing/reading
var rowid = client.get('csv row counter');
rowid = rowid || 1;
// `csv` is an array of your json objects
for (var i=0; i<csv.length; i++) {
client.set('csv-'+(rowid+i), JSON.stringify(csv[i]));
}
client.set('csv row counter', rowid+i);
如果您需要使用此方法,请确保rowid
的范围正确,以便同步上传将适当增加。
相反,如果您需要单独跟踪每个CSV,那么您只需要对该行进行命名,并引用其CSV:
// `csvname` is initialized with the chosen name for this csv
for (var i=0; i<csv.length; i++) {
client.set(csvname+'-'+i, JSON.stringify(csv[i]));
}
答案 1 :(得分:2)
键值存储允许您使用数据结构中更快的搜索(通常为O(log n))替换CSV文件中的行的线性搜索。并且可以为您提供关键值的范围查询。
仅使用 将文件名作为密钥,并不会因为将数据留在文件系统中而花费太多。但{file name}.{row number}
,并将每行存储为值,可能就是您所需要的,具体取决于每行中的内容。
简而言之:存储小值;选择你经常搜索的东西,这在排序时是有意义的,作为关键。