将CSV数据上传到Redis

时间:2015-04-28 03:37:27

标签: node.js redis node-redis

我有一个包含1000行和大约15列的CSV文件。我计划将每行作为Redis值存储为简单的JSON对象,将CSV文件的行号存储为Redis键。但是,一旦我开始将多个CSV文件上传到Redis,在数据库中区分一个CSV文件与另一个CSV文件的最佳方法是什么?除了不同的Redis数据库实例本身以外,除了Redis之外没有其他更大结构的所有键值是不是Redis?我知道Redis在记忆中,但即便如此......如果你有数百万条记录,搜索所需的密钥效率是不是很低?我不明白。如果我上传了100万个CSV文件,每个文件有1000行,那么搜索记录就会达到10亿条,即使对于内存数据库也是如此。我应该采取另一种方式。

我正在寻找一种方法,以高效和合理的方式在Redis中表示我的每个CSV文件,其中每个CSV文件行都有自己的唯一键,Redis值将是列标题和数据。

我如何做到这一点?

一个解决方案是每个键代表整个CSV文件,但我希望看看是否还有其他选项。

2 个答案:

答案 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},并将每行存储为值,可能就是您所需要的,具体取决于每行中的内容。

简而言之:存储小值;选择你经常搜索的东西,这在排序时是有意义的,作为关键。

相关问题