【问题标题】:Uploading CSV data to Redis将 CSV 数据上传到 Redis
【发布时间】:2015-04-28 03:37:27
【问题描述】:

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

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

我该如何做到这一点?

一种解决方案是让每个键代表整个 CSV 文件,但我正在寻找是否有其他选择。

【问题讨论】:

  • Redis 中数据的最佳键是什么,实际上取决于您将如何使用数据以及数据的特征。您可以从使用 csv 中的唯一 ID 作为键开始。这篇文章openmymind.net/Data-Modeling-In-Redis会帮你有个大概的思路。

标签: node.js redis node-redis


【解决方案1】:

你很有创意。

您没有指定将所有 CSV 分开是否重要,或者是否所有数据都可以集中到一个“组”式的逻辑结构中(就像在 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]));
}

【讨论】:

  • 是的,您可以将整个 CSV 文件的所有数据放入一个键值对中,我只是在想这可能不是很有效,尤其是对于搜索
  • 我没有远程建议您应该将整个 CSV 放入一个键值对,而是不同 CSV 行的键不必在逻辑上分开(在第一个示例中) .如果你需要它们在逻辑上是分开的,你可以使用第二个例子。
【解决方案2】:

键值存储可让您将 CSV 文件中的行的线性搜索替换为数据结构中的更快搜索(通常为 O(log n))。并且还可以为您提供对键值的范围查询。

使用文件名作为密钥并不会比使用将数据保留在文件系统中给您带来太多好处。但是{file name}.{row number},并将每一行存储为一个值,可能是您需要的,具体取决于每一行中的内容。

简而言之:存储小值;选择您经常搜索并且在排序时有意义的内容作为键。

【讨论】:

    猜你喜欢
    • 2021-03-05
    • 2013-06-13
    • 2020-01-21
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多